what is nullpointerexception java how avoid it
Questo tutorial spiegherà tutto sulla NullPointerException in Java. Discuteremo le cause dell'eccezione del puntatore nullo e i modi per evitarlo:
NullPointerException in Java è un'eccezione di runtime. Java assegna uno speciale valore nullo a un riferimento a un oggetto. Quando un programma tenta di utilizzare un riferimento a un oggetto impostato sul valore null, viene generata questa eccezione.
=> Guarda qui la serie di formazione su Java semplice.
Cosa imparerai:
NullPointerException in Java
Se un riferimento a un oggetto con valore null genera NullPointerException, perché è necessario un valore null?
Il valore nullo viene solitamente utilizzato per indicare che nessun valore è stato assegnato a una variabile di riferimento. In secondo luogo, abbiamo bisogno di valori nulli per raccolte come elenchi collegati e alberi per indicare nodi nulli. I modelli di progettazione come i modelli singleton utilizzano valori nulli.
Per concludere, il valore null in Java ha molti usi. L'eccezione puntatore nullo viene generata in scenari specifici in Java.
Alcuni degli scenari sono i seguenti:
- Metodo richiamato utilizzando un oggetto nullo.
- Accesso o modifica di un campo o di un membro dati dell'oggetto null.
- Passaggio di un oggetto null come argomento a un metodo.
- Calcolo della lunghezza di una matrice nulla.
- Accesso all'indice di un array null.
- Sincronizzazione di un oggetto nullo.
- Lanciare un oggetto nullo.
L'eccezione Pointer Null si estende dalla classe RuntimeException.
La gerarchia di NullPointerException è fornita di seguito.
Come mostrato nella gerarchia precedente, l'eccezione del puntatore null si estende dalla RuntimeException che eredita la classe Exception. La classe di eccezione a sua volta è derivata dalla classe Throwable che è una sottoclasse di Object.
Cause dell'occorrenza di java.lang.NullPointerException
Ora mostreremo ciascuno degli scenari di occorrenza di NullPointerException che abbiamo elencato sopra.
# 1) Il metodo viene richiamato utilizzando un oggetto nullo
Considera il seguente esempio di codice. Qui abbiamo una classe, MyClass che fornisce due metodi. Il primo metodo 'initT' restituisce un oggetto nullo. Nel metodo principale creiamo un oggetto di MyClass con una chiamata al metodo initT.
Successivamente, chiamiamo il metodo di stampa di MyClass. Qui, viene lanciata java.lang.NullPointerException mentre chiamiamo il metodo print utilizzando un oggetto null.
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 } }
Produzione
# 2) Campo di accesso di un oggetto nullo
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 } }
Produzione
sito web di prova in diversi browser gratuitamente
Questa è un'altra causa di NullPointerException. Qui tentiamo di accedere a un membro della classe utilizzando un oggetto nullo. Assegniamo il valore di ritorno del metodo initT all'oggetto t e quindi accediamo a numField usando l'oggetto t. Ma l'oggetto t è un oggetto nullo poiché initT restituisce un oggetto nullo. A questo punto, viene sollevata java.lang.NullPointerException.
# 3) Passaggio di un oggetto nullo come argomento
Questa è la causa comune dell'occorrenza di java.lang.NullPointerException. Considera il seguente programma Java. Qui abbiamo un metodo 'print_LowerCase' che converte in minuscolo l'oggetto String passato come argomento.
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 } }
Produzione
Nel metodo principale, chiamiamo questo metodo e passiamo un null come argomento. Poiché l'oggetto String non può essere null, viene generata l'eccezione java.lang.NullPointerException.
# 4) Ottenere la lunghezza di un array nullo
Anche il tentativo di calcolare la lunghezza di un array nullo genera java.lang.NullPointerException.
Il programma seguente lo dimostra.
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 } }
Produzione
Nel programma sopra, dichiariamo un array e gli assegniamo null, cioè nessun dato. Quando usiamo la proprietà length su questo array null, viene generata NullPointerException.
# 5) Indice di accesso di un array nullo
Simile a length, anche se proviamo ad accedere a un valore in un array null utilizzando un indice, è la causa di 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)); } }
Produzione
Nel programma sopra, proviamo ad accedere al valore all'indice 2 di un array nullo.
# 6) Sincronizzazione su un oggetto nullo
Di solito sincronizziamo un blocco o un metodo per facilitare l'accesso simultaneo. Tuttavia, il riferimento all'oggetto che usiamo per la sincronizzazione non dovrebbe essere nullo. Se è un oggetto nullo, risulta in java.lang.NullPointerException.
Il seguente programma Java lo dimostra. Come possiamo vedere, abbiamo un oggetto String 'mutex' inizializzato a null. Quindi nella funzione principale, usiamo un blocco sincronizzato con mutex come riferimento all'oggetto. Poiché mutex è null, viene sollevata 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'); } } }
Produzione
# 7) Lanciando null
public class Main { public static void main(String() args) { throw null; //throw null } }
Produzione:
Nel programma di esempio sopra, invece di lanciare un oggetto valido, viene lanciato null. Ciò si traduce in eccezione puntatore nullo.
Evitare l'eccezione del puntatore nullo
Ora che abbiamo visto le cause del verificarsi di NullPointerException, dobbiamo anche cercare di evitarlo nel nostro programma.
Innanzitutto, dobbiamo assicurarci che gli oggetti che utilizziamo nei nostri programmi siano inizializzati correttamente in modo da evitare l'uso di oggetti nulli che risultano in un'eccezione puntatore nullo. Dovremmo anche fare attenzione che le variabili di riferimento utilizzate nel programma siano puntate a valori validi e non acquisiscano accidentalmente valori nulli.
Oltre a queste considerazioni, possiamo anche esercitare maggiore cautela caso per caso per evitare java.lang.NullPointerException.
Di seguito consideriamo alcuni casi.
# 1) Confronto di stringhe con letterali
Un confronto tra la variabile stringa e un valore letterale (valore effettivo o elemento dell'enumerazione) è un'operazione molto comune nei programmi Java. Ma se la variabile String che è un oggetto è null, il confronto di questo oggetto null con i valori letterali genererà NullPointerException.
Quindi la soluzione è richiamare il metodo di confronto dal valore letterale anziché dall'oggetto String che può essere nullo.
Il seguente programma mostra come richiamare metodi di confronto da valori letterali ed evitare 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'); } } }
Produzione
# 2) Controlla gli argomenti di un metodo
Controllare gli argomenti del metodo per assicurarsi che non siano valori nulli. Se gli argomenti non sono come da specifica, il codice genererà IllegalArgumentException per indicare che gli argomenti non sono come previsto.
Questo è mostrato nel seguente programma Java.
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(); } }
Produzione
# 3) Uso dell'operatore ternario per prendersi cura dei valori nulli
Possiamo usare l'operatore ternario per evitare java.lang.NullPointerException. L'operatore ternario ha tre operatori. La prima è un'espressione booleana che restituisce true o false. Se l'espressione è vera, viene restituito il secondo operatore o il terzo operatore.
Il seguente programma mostra l'uso di un operatore ternario per evitare 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); }
Produzione
Domande frequenti
D # 1) Come posso correggere NullPointerException in Java?
Risposta: Dobbiamo assicurarci che tutti gli oggetti utilizzati nel programma siano inizializzati correttamente e non abbiano valori nulli. Inoltre, le variabili di riferimento non dovrebbero avere valori nulli.
# 2) NullPointerException è selezionata o deselezionata?
Risposta: NullPointerException non è un'eccezione controllata. È un discendente di RuntimeException ed è deselezionato.
# 3) Come si interrompe NullPointerException?
Risposta: Alcune delle migliori pratiche per evitare NullPointerException sono:
- Usa il metodo equals () ed equalsIgnoreCase () con String letterale invece di usarlo sull'oggetto sconosciuto che può essere nullo.
- Usa valueOf () invece di toString (); ed entrambi restituiscono lo stesso risultato.
- Usa l'annotazione Java @NotNull e @Nullable.
# 4) Qual è il valore nullo in Java?
Risposta: Un valore null non si riferisce a nessun oggetto o variabile. È una parola chiave e un letterale. Rappresenta un riferimento nullo.
# 5) Possiamo catturare NullPointerException in Java?
Risposta: L'eccezione java.lang.NullPointerException è un'eccezione non controllata ed estende la classe RuntimeException. Quindi non vi è alcuna costrizione per il programmatore a prenderlo.
Conclusione
In questo tutorial, abbiamo discusso la NullPointerException in Java. Questa è un'eccezione piuttosto pericolosa e di solito può apparire quando meno ce lo aspettiamo. L'eccezione del puntatore nullo si verifica principalmente a causa dell'oggetto nullo o del riferimento nullo. Abbiamo già visto le cause e i modi per evitare NullPointerException.
Per quanto possibile, il programmatore dovrebbe cercare di evitare il verificarsi di un'eccezione puntatore nullo in un programma. Poiché si tratta di un'eccezione di runtime non controllata, dovremmo vedere che non si verifica quando l'applicazione è in esecuzione.
=> Visita qui per imparare Java da zero.
Lettura consigliata
- Eccezioni Java e gestione delle eccezioni con esempi
- Come gestire l'eccezione ArrayIndexOutOfBoundsException in Java?
- Esercitazione sulla gestione delle eccezioni C # con esempi di codice
- Guida completa alla gestione delle eccezioni PL SQL con esempi
- Come gestire le eccezioni negli script Groovy SoapUI - Tutorial SoapUI # 11
- Python Try Except - Python Handling Eccezione con esempi
- Gestione delle eccezioni JDBC - Come gestire le eccezioni SQL
- Gestione delle eccezioni in C ++