what is nullpointerexception java how avoid it
Ovaj će vodič objasniti sve o NullPointerExceptionu na Javi. Razgovarat ćemo o uzrocima iznimke null pokazivača i načinima kako to izbjeći:
NullPointerException u Javi je runtime iznimka. Java referenci objekta dodjeljuje posebnu null vrijednost. Kada program pokuša upotrijebiti referencu objekta postavljenu na null vrijednost, tada se izuzetak baca.
=> Ovdje pripazite na jednostavnu seriju Java treninga.
Što ćete naučiti:
NullPointerException u Javi
Ako referenca na objekt s null vrijednošću baca NullPointerException, zašto nam onda treba null vrijednost?
Nulta vrijednost obično se koristi da naznači da referentnoj varijabli nije dodijeljena nikakva vrijednost. Drugo, trebamo null vrijednosti za zbirke poput povezanih popisa i stabala kako bismo označili null čvorove. Uzorci dizajna poput jednobojnih uzoraka koriste null vrijednosti.
Da zaključimo, null vrijednost u Javi ima mnoge svrhe. Null Pointer Exception baca se u određenim scenarijima na Javi.
Neki od scenarija su sljedeći:
- Metoda koja se poziva pomoću null objekta.
- Pristupanje ili izmjena polja ili člana podataka null objekta.
- Prosljeđivanje null objekta kao argumenta metode.
- Izračunavanje duljine nultog niza.
- Pristup indeksu nultog niza.
- Sinkronizacija null objekta.
- Bacanje nultih predmeta.
Iznimka Null Pointer proteže se od klase RuntimeException.
Hijerarhija NullPointerException dana je u nastavku.
Kao što je prikazano u gornjoj hijerarhiji, Null Pointer Exception proteže se od RuntimeException koji nasljeđuje klasu Exception. Klasa iznimke zauzvrat je izvedena iz klase Throwable koja je podrazred objekta.
Uzroci pojave java.lang.NullPointerException
Sada ćemo pokazati svaki od scenarija pojave NullPointerException koji smo gore naveli.
# 1) Metoda se poziva pomoću null objekta
Razmotrite sljedeći primjer koda. Ovdje imamo klasu MyClass koja nudi dvije metode. Prva metoda 'initT' vraća null objekt. U glavnoj metodi stvaramo objekt MyClass s pozivom na metodu initT.
Dalje nazivamo metodu ispisa MyClass. Ovdje se baca java.lang.NullPointerException dok pozivamo metodu ispisa pomoću null objekta.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String[] args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Izlaz
# 2) Pristupno polje nultog objekta
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String[] args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Izlaz
pitanja i odgovori na intervjuu za osiguranje kvalitete
Ovo je još jedan uzrok NullPointerException. Ovdje pokušavamo pristupiti članu klase pomoću null objekta. Objektu t dodjeljujemo povratnu vrijednost metode initT, a zatim pristupimo numFieldu pomoću objekta t. Ali objekt t je nulti objekt jer initT vraća nulti objekt. U ovom se trenutku podiže java.lang.NullPointerException.
# 3) Prosljeđivanje null objekta kao argumenta
To je uobičajeni uzrok pojave java.lang.NullPointerException. Razmotrite sljedeći Java program. Ovdje imamo metodu 'print_LowerCase' koja pretvara objekt String prosljeđen kao argument u malo slovo.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String[] args) { print_LowerCase(null); //pass null object as argument to the method } }
Izlaz
U glavnoj metodi pozivamo ovu metodu i kao argument prosljeđujemo nulu. Kako objekt String ne može biti null, baca se java.lang.NullPointerException.
# 4) Dobivanje duljine nultog niza
Pokušaj izračunavanja duljine nultog niza također rezultira izbacivanjem java.lang.NullPointerException.
Program u nastavku to pokazuje.
public class Main { public static void main(String[] args) { int[] dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Izlaz
U gornjem programu deklariramo niz i dodjeljujemo mu nulu, tj. Nema podataka. Kada koristimo svojstvo length na ovom null polju, baca se NullPointerException.
# 5) Indeks pristupa nultog niza
Slično dužini, čak i ako pokušavamo pristupiti vrijednosti u null nizu pomoću indeksa, to je uzrok java.lang.NullPointerException.
public class Main { public static void main(String[] args) { int[] dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray[2]); } }
Izlaz
U gornjem programu pokušavamo pristupiti vrijednosti s indeksom 2 nultog niza.
# 6) Sinkronizacija na null objektu
Obično sinkroniziramo blok ili metodu kako bismo olakšali istodobni pristup. Međutim, referenca objekta koju koristimo za sinkronizaciju ne smije biti nula. Ako je null objekt, to rezultira java.lang.NullPointerException.
To pokazuje donji Java program. Kao što vidimo, imamo String objekt 'mutex' inicijaliziran na nulu. Tada u glavnoj funkciji koristimo sinkronizirani blok s muteksom kao referencom objekta. Kako je mutex null, podiže se java.lang.NullPointerException.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String[] args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Izlaz
# 7) Bacanjem null
public class Main { public static void main(String[] args) { throw null; //throw null } }
Izlaz:
U gornjem primjeru programa, umjesto bacanja valjanog objekta, baca se null. To rezultira izuzećem null pokazivača.
Izbjegavanje izuzetaka null pokazivača
Sad kad smo vidjeli uzroke pojave NullPointerException, moramo to također pokušati izbjeći u našem programu.
Prvo, moramo osigurati da se objekti koje koristimo u našim programima pravilno inicijaliziraju kako bismo mogli izbjeći upotrebu null objekata koji rezultiraju Null Pointer Exception-om. Također bismo trebali voditi računa da referentne varijable korištene u programu budu usmjerene na važeće vrijednosti i da slučajno ne stječu null vrijednosti.
Osim ovih razmatranja, također možemo biti oprezniji od slučaja do slučaja kako bismo izbjegli java.lang.NullPointerException.
U nastavku razmatramo nekoliko slučajeva.
# 1) Usporedba nizova s literalima
Usporedba varijable niza s literalom (stvarna vrijednost ili element nabrajanja) vrlo je česta operacija u Java programima. Ali ako je varijabla String koja je objekt null, tada će usporedba ovog null objekta s literalima baciti NullPointerException.
Dakle, rješenje je pozivanje metode usporedbe iz doslovnog umjesto String objekta koji može biti null.
Sljedeći program pokazuje kako možemo pozvati metode usporedbe iz literala i izbjeći java.lang.NullPointerException.
class Main { public static void main (String[] args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Izlaz
# 2) Obavezno provjerite argumente metode
Provjerite argumente metode kako biste bili sigurni da nisu null vrijednosti. Ako argumenti nisu u skladu sa specifikacijom, tada će kôd baciti IllegalArgumentException kako bi ukazao da argumenti nisu onakvi kako se očekuje.
To je prikazano u donjem Java programu.
import java.io.*; class Main { public static void main (String[] args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Izlaz
# 3) Upotreba Ternarnog operatora za brigu o null vrijednostima
Ternarni operator možemo koristiti da izbjegnemo java.lang.NullPointerException. Ternarni operator ima tri operatora. Prvi je logički izraz koji procjenjuje na true ili false. Ako je izraz istinit, tada se vraća drugi operator ili se vraća treći operator.
Sljedeći program prikazuje upotrebu ternarnog operatora kako bi se izbjeglo NullPointerException.
import java.io.*; class Main { public static void main (String[] args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Izlaz
Često postavljana pitanja
P # 1) Kako popraviti NullPointerException u Javi?
Odgovor: Moramo osigurati da su svi objekti korišteni u programu pravilno inicijalizirani i da nemaju null vrijednosti. Također, referentne varijable ne bi trebale imati null vrijednosti.
# 2) Je li NullPointerException označen ili nije?
Odgovor: NullPointerException nije provjerena iznimka. Potomak je RuntimeException i nije označen.
# 3) Kako zaustaviti NullPointerException?
Odgovor: Neke od najboljih praksi za izbjegavanje NullPointerException su:
- Upotrijebite metode equals () i equalsIgnoreCase () s String literalom, umjesto da ga koristite na nepoznatom objektu koji može biti null.
- Upotrijebite valueOf () umjesto toString (); i oboje vraćaju isti rezultat.
- Koristite Java napomene @NotNull i @Nullable.
# 4) Koja je null vrijednost u Javi?
Odgovor: Null vrijednost se ne odnosi na bilo koji objekt ili varijablu. To je ključna riječ i doslovno. Predstavlja nulu referencu.
# 5) Možemo li uhvatiti NullPointerException u Javi?
Odgovor: Iznimka java.lang.NullPointerException je neprovjerena iznimka i proširuje klasu RuntimeException. Stoga programer nema prisile da je uhvati.
Zaključak
U ovom uputstvu raspravljali smo o NullPointerExceptionu na Javi. Ovo je prilično opasna iznimka i obično se može pojaviti kada se najmanje nadamo. Izuzetak null pokazivača uglavnom se događa zbog null objekta ili null reference. Već smo vidjeli uzroke i načine kako izbjeći NullPointerException.
Što je više moguće, programer bi trebao pokušati izbjeći pojavu Null Pointer Exception u programu. Budući da se radi o neprovjerenoj iznimci za vrijeme izvođenja, trebali bismo vidjeti da se ona ne događa kada se aplikacija izvodi.
=> Posjetite ovdje da biste naučili Javu ispočetka.
Preporučena literatura
- Java iznimke i rukovanje iznimkama s primjerima
- Kako postupati s ArrayIndexOutOfBoundsException u Javi?
- Vodič za rukovanje iznimkama za C # s primjerima koda
- Cjelovit vodič za rukovanje iznimkama PL SQL-a s primjerima
- Kako postupati s iznimkom u Groovy skriptama SoapUI - Vodič za SoapUI br. 11
- Python Try Except - obrada iznimke s Pythonom s primjerima
- Rukovanje iznimkama JDBC - Kako postupati s SQL iznimkama
- Rukovanje iznimkama na C ++