what is nullpointerexception java how avoid it
Acest tutorial va explica totul despre excepția NullPointerException din Java. Vom discuta despre cauzele excepției indicatorului nul și modalități de a o evita:
NullPointerException în Java este o excepție de rulare. Java atribuie o valoare nulă specială unei referințe de obiect. Când un program încearcă să utilizeze o referință de obiect setată la valoarea nulă, atunci se aruncă această excepție.
=> Urmăriți aici seria de antrenament Java simplă.
Ce veți învăța:
NullPointerException În Java
Dacă o referință de obiect cu valoare nulă aruncă NullPointerException, atunci de ce avem nevoie de o valoare nulă?
Valoarea nulă este de obicei utilizată pentru a indica faptul că nu a fost atribuită nicio valoare unei variabile de referință. În al doilea rând, avem nevoie de valori nule pentru colecții cum ar fi listele legate și arborii pentru a indica noduri nule. Modelele de proiectare, cum ar fi modelele singleton, utilizează valori nule.
În concluzie, valoarea nulă din Java are multe utilizări. Excepția Null Pointer este aruncată în scenarii specifice în Java.
Unele dintre scenarii sunt următoarele:
- Metoda invocată folosind un obiect nul.
- Accesarea sau modificarea unui câmp sau membru al obiectului nul.
- Trecerea obiectului nul ca argument către o metodă.
- Se calculează lungimea unui tablou nul.
- Accesarea indexului unui tablou nul.
- Sincronizarea unui obiect nul.
- Aruncarea unui obiect nul.
Excepția Null Pointer se extinde din clasa RuntimeException.
Ierarhia NullPointerException este dată mai jos.
Așa cum se arată în ierarhia de mai sus, Null Pointer Exception se extinde de la RuntimeException care moștenește clasa Exception. Clasa de excepție, la rândul său, este derivată din clasa Throwable care este o subclasă a obiectului.
Cauzele apariției java.lang.NullPointerException
Acum vom demonstra fiecare dintre scenariile de apariție NullPointerException pe care le-am enumerat mai sus.
# 1) Metoda este invocată folosind un obiect nul
Luați în considerare următorul exemplu de cod. Aici avem o clasă, MyClass, care oferă două metode. Prima metodă „initT” returnează un obiect nul. În metoda principală, creăm un obiect MyClass cu un apel către metoda initT.
Apoi, numim metoda de imprimare MyClass. Aici, java.lang.NullPointerException este aruncat în timp ce apelăm metoda de imprimare folosind un obiect nul.
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 } }
Ieșire
# 2) Câmpul de acces al unui obiect nul
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 } }
Ieșire
cu ce să deschideți fișiere XML
Aceasta este o altă cauză a NullPointerException. Aici încercăm să accesăm un membru al clasei folosind un obiect nul. Atribuim valoarea de returnare a metodei initT obiectului t și apoi accesăm numField folosind obiectul t. Dar obiectul t este un obiect nul, deoarece initT returnează un obiect nul. În acest moment, se ridică java.lang.NullPointerException.
# 3) Trecerea unui obiect nul ca argument
Aceasta este cauza comună a apariției java.lang.NullPointerException. Luați în considerare următorul program Java. Aici avem o metodă „print_LowerCase” care convertește obiectul String transmis ca argument într-o minusculă.
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 } }
Ieșire
În metoda principală, numim această metodă și trecem un argument nul ca argument. Deoarece obiectul String nu poate fi nul, se aruncă java.lang.NullPointerException.
# 4) Obținerea lungimii unui tablou nul
Încercarea de a calcula lungimea unei matrice nule are ca rezultat aruncarea java.lang.NullPointerException.
Programul de mai jos demonstrează acest lucru.
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 } }
Ieșire
În programul de mai sus, declarăm o matrice și îi atribuim nul, adică nu există date. Când folosim proprietatea length pe această matrice nulă, NullPointerException este aruncat.
# 5) Indexul de acces al unui tablou nul
Similar cu lungimea, chiar dacă încercăm să accesăm o valoare într-o matrice nulă utilizând un index, aceasta este cauza 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)); } }
Ieșire
În programul de mai sus, încercăm să accesăm valoarea de la indexul 2 al unui tablou nul.
# 6) Sincronizare pe un obiect nul
De obicei sincronizăm un bloc sau o metodă pentru a facilita accesul simultan. Cu toate acestea, referința la obiect pe care o folosim pentru sincronizare nu ar trebui să fie nulă. Dacă este un obiect nul, atunci rezultă java.lang.NullPointerException.
Programul Java de mai jos demonstrează acest lucru. După cum putem vedea, avem un obiect String „mutex” inițializat la nul. Apoi, în funcția principală, folosim un bloc sincronizat cu mutex ca referință de obiect. Deoarece mutex este nul java.lang.NullPointerException este ridicat.
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'); } } }
Ieșire
# 7) Aruncând nul
public class Main { public static void main(String() args) { throw null; //throw null } }
Ieșire:
În programul de exemplu de mai sus, în loc de a arunca un obiect valid, este aruncat nul. Acest lucru are ca rezultat Null Pointer Exception.
Evitarea excepției indicatorului nul
Acum că am văzut cauzele apariției NullPointerException, trebuie să încercăm să o evităm și în programul nostru.
În primul rând, trebuie să ne asigurăm că obiectele pe care le folosim în programele noastre sunt inițializate corespunzător, astfel încât să putem evita utilizarea obiectelor nule care au ca rezultat excepția indicatorului nul. De asemenea, ar trebui să avem grijă ca variabilele de referință utilizate în program să fie îndreptate spre valori valide și să nu dobândească în mod accidental valori nule.
În afară de aceste considerații, putem, de asemenea, să fim mai prudenți, de la caz la caz, pentru a evita java.lang.NullPointerException.
Mai jos analizăm câteva cazuri.
# 1) Comparație șir cu literale
O comparație între variabila șir și un literal (valoarea reală sau elementul enum) este o operație foarte obișnuită în programele Java. Dar dacă variabila String care este un obiect este nulă, atunci compararea acestui obiect nul cu literalele va arunca NullPointerException.
Deci, soluția este de a invoca metoda de comparație din literal în loc de obiectul String care poate fi nul.
Următorul program arată cum putem invoca metode de comparație din literale și să evităm 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'); } } }
Ieșire
# 2) Păstrați o verificare a argumentelor unei metode
Verificați argumentele metodei pentru a vă asigura că acestea nu sunt valori nule. Dacă argumentele nu sunt conform specificației, atunci codul va arunca IllegalArgumentException pentru a indica faptul că argumentele nu sunt așa cum era de așteptat.
Acest lucru este prezentat în programul Java de mai jos.
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(); } }
Ieșire
# 3) Utilizarea operatorului ternar pentru a avea grijă de valorile nule
Putem folosi operatorul ternar pentru a evita java.lang.NullPointerException. Operatorul ternar are trei operatori. Prima este o expresie booleană care se evaluează la adevărat sau fals. Dacă expresia este adevărată, atunci se returnează al doilea operator sau se returnează al treilea operator.
Următorul program arată utilizarea unui operator ternar pentru a evita 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); }
Ieșire
întrebări frecvente
Q # 1) Cum remediez NullPointerException în Java?
Răspuns: Trebuie să ne asigurăm că toate obiectele utilizate în program sunt inițializate corect și că nu au valori nule. De asemenea, variabilele de referință nu trebuie să aibă valori nule.
# 2) NullPointerException este bifată sau debifată?
Răspuns: NullPointerException nu este o excepție verificată. Este un descendent al RuntimeException și este debifat.
# 3) Cum opresc NullPointerException?
Răspuns: Unele dintre cele mai bune practici pentru a evita NullPointerException sunt:
- Utilizați metoda equals () și equalsIgnoreCase () cu literal String în loc să o utilizați pe obiectul necunoscut care poate fi nul.
- Folosiți valueOf () în loc de toString (); și ambii returnează același rezultat.
- Utilizați adnotarea Java @NotNull și @Nullable.
# 4) Care este valoarea nulă în Java?
Răspuns: O valoare nulă nu se referă la niciun obiect sau variabilă. Este un cuvânt cheie și un literal. Reprezintă o referință nulă.
# 5) Putem prinde NullPointerException în Java?
Răspuns: Excepția java.lang.NullPointerException este o excepție necontrolată și extinde clasa RuntimeException. Prin urmare, programatorul nu este obligat să-l prindă.
Concluzie
În acest tutorial, am discutat despre NullPointerException în Java. Aceasta este o excepție destul de periculoasă și poate apărea de obicei atunci când ne așteptăm cel mai puțin. Excepția indicatorului nul apare mai ales din cauza obiectului nul sau a referinței nule. Am văzut deja cauzele și modalitățile de a evita NullPointerException.
Pe cât posibil, programatorul ar trebui să încerce să evite apariția Excepției Null Pointer într-un program. Deoarece aceasta este o excepție de runtime necontrolată, ar trebui să vedem că nu apare atunci când aplicația rulează.
=> Vizitați aici pentru a afla Java de la zero.
Lectură recomandată
- Excepții Java și gestionarea excepțiilor cu exemple
- Cum să gestionați excepția ArrayIndexOutOfBoundsException în Java?
- Tutorial de gestionare a excepțiilor C # cu exemple de cod
- Ghid complet pentru gestionarea excepțiilor PL SQL cu exemple
- Cum să gestionați excepția în scripturile SoapUI Groovy - Tutorialul SoapUI # 11
- Python Try Except - Excepția de manipulare Python cu exemple
- JDBC Exception Handling - Cum să gestionați excepțiile SQL
- Manevrarea excepțiilor în C ++