English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Breve introduzione alla gestione delle eccezioni di riferimento nullo in Java

Secondo il professore, nella parte successiva dello studio, la maggior parte delle eccezioni saranno eccezioni di NullPointer. Quindi, riservare un po' di tempo per giocare a giochi per cercare cosa sia l'eccezione di NullPointer

Prima di tutto: le principali cause di eccezioni di NullPointer sono le seguenti:

(1) Quando si chiama un metodo su un oggetto inesistente si verifica un'eccezione obj.method() // L'oggetto obj non esiste

(2) Quando si accede o si modifica un campo di un oggetto inesistente si verifica un'eccezione obj.method() // Il metodo method non esiste

(3) La variabile di tipo stringa non è inizializzata;

(4) Gli oggetti di tipo interfaccia non sono inizializzati con classi specifiche, ad esempio:

List lt; genererà un errore
List lt = new ArrayList(); allora non verrà generato un errore

Quando il valore di un oggetto è vuoto, non hai giudicato che è vuoto. Puoi provare a aggiungere una riga di codice prima del seguente codice:

if(rb!=null && rb!="") 

Modificato in:

if(rb==null); 
if(rb!==null&&rb!="") o if(("").equals(rb)) 

Soluzioni per la risoluzione di NullPointer:

Focalizzati sulla riga in cui si verifica l'errore, diagnostica gli errori specifici attraverso le due principali cause di eccezioni di NullPointer. Allo stesso tempo, per evitare la generazione di eccezioni di NullPointer, è meglio mettere "null" o valori vuoti prima del valore impostato durante il processo di giudizio e elaborazione.
 

Breve analisi delle eccezioni di NullPointer comuni:

(1) Errore di NullPointer Java.lang.NullPointerException

I 8 tipi di dati fondamentali in Java, i valori delle variabili possono avere valori predefiniti. Se non vengono assegnati valori normali, il virtual machine Java non può compilare correttamente. Pertanto, l'uso dei tipi di dati Java di base non solleva di solito eccezioni di NullPointer. Durante lo sviluppo reale, la maggior parte delle eccezioni di NullPointer sono correlate alle operazioni sugli oggetti.

Secondo, il meccanismo di gestione delle eccezioni in Java

Ci sono due modi per gestire il codice che potrebbe generare eccezioni:

Prima di tutto, utilizzare le istruzioni try...catch per catturare ed elaborare le eccezioni nel codice, le istruzioni catch possono essere multiple e servono a corrispondere più eccezioni. Ad esempio:

public void p(int x){
try{
...
}catch(Exception e){
...
}finally{
...
}}

Secondo, per gestire eccezioni che non possono essere gestite o per trasformare eccezioni, è necessario dichiarare tramite

La clausola throws lancia un'eccezione. Ad esempio:

public void test1() throws MyException{
...
if(....){
throw new MyException();
}}

Se ogni metodo lancia semplicemente un'eccezione, quando ci sono chiamate a metodo in un'elenco di chiamate a metodo a livello di profondità, il JVM cerca indietro dal blocco di codice del metodo che ha generato l'eccezione fino a trovare il blocco di codice che gestisce l'eccezione. Poi passing l'eccezione alla clausola catch corrispondente. Se il JVM raggiunge il metodo main() alla fine della catena di chiamate dei metodi e non trova un blocco di codice che gestisce l'eccezione, il trattamento dell'eccezione avviene secondo i seguenti passaggi:

Primo, chiamare il metodo printStackTrace() dell'oggetto che ha generato l'eccezione, per stampare le informazioni di eccezione della catena di chiamate dei metodi.

Secondo, se il thread che ha generato l'eccezione è il thread principale, l'esecuzione dell'intero programma viene interrotta; se non è il thread principale, viene interrotto il thread corrente, mentre gli altri thread continuano a funzionare.

Analizzando e riflettendo, possiamo vedere che il più presto si gestisce un'eccezione, meno risorse e tempo vengono consumati, e l'area di impatto è più piccola. Pertanto, non si dovrebbe passare all'utente le eccezioni che si possono gestire.

Ancora un punto, non trascurabile: la clausola finally deve sempre eseguire il codice in qualsiasi situazione, garantendo la affidabilità del codice che deve essere eseguito in qualsiasi situazione. Ad esempio, in caso di eccezione nella query del database, è necessario rilasciare la connessione JDBC, ecc. La clausola finally viene eseguita prima della clausola return, indipendentemente dalla loro posizione e dal fatto che il blocco try presenti o meno un'eccezione. L'unica situazione in cui la clausola finally non viene eseguita è quando il metodo esegue il metodo System.exit(). Il metodo System.exit() ha l'effetto di terminare il JVM in esecuzione. Non è possibile modificare il valore di ritorno di return assegnando un nuovo valore a una variabile all'interno del blocco finally, e si consiglia di non usare la clausola return all'interno del blocco finally, poiché è priva di senso e può causare errori.

Infine, è necessario prestare attenzione alle regole sintattiche di gestione delle eccezioni:

Primo di tutto,La clausola try non può esistere da sola, può essere combinata con catch e finally

Le struttura try...catch...finally, try...catch e try...finally, la clausola catch può avere una o più eccezioni, la clausola finally può avere al massimo una, e le parole chiave try, catch, finally non possono essere usate singolarmente.

Secondo,}}L'ambito dei variabili nei blocchi try, catch, finally è indipendente e non può essere acceduto reciprocamente. Se si desidera che le variabili siano accessibili nei tre blocchi, è necessario definire le variabili al di fuori di questi blocchi.

Terzo,Quando ci sono più blocchi catch, il virtual machine Java abbinerà una classe di eccezione o una sua sottoclasse, eseguirà questo blocco catch e non eseguirà altri blocchi catch.

Quarto,La frase throw non permette di avere altre frasi consecutive, poiché queste non hanno l'opportunità di essere eseguite.

Quinto,Se un metodo chiama un altro metodo che dichiara di lanciare un'eccezione, allora questo metodo deve gestire l'eccezione o dichiarare di lanciarla.

2.2 Differenza tra throw e throws:

throw viene utilizzato per lanciare un'eccezione, all'interno del metodo. La sintassi è: throw oggetto_di_eccezione。

throws viene utilizzato per dichiarare che un metodo potrebbe lanciare quale tipo di eccezione, dopo il nome del metodo, la sintassi è:

throws tipo_di_eccezione1, tipo_di_eccezione2... tipo_di_eccezioneN。

Terzo: di seguito sono elencate alcune situazioni in cui può verificarsi un'eccezione di puntatore nullo e le soluzioni corrispondenti:

Codice sezione 1:

out.println(request.getParameter("username")); 

Analisi:La funzione del segmento di codice 1 è molto semplice, ovvero visualizzare il valore inserito dall'utente "username".

Spiegazione:Sembra che la frase sopra non trovi errori di sintassi e, nella maggior parte dei casi, non incontra problemi. Tuttavia, se un utente non fornisce il valore del campo del modulo "username" durante l'inserimento dei dati o lo inserisce direttamente bypassando il modulo, il valore di request.getParameter("username") è vuoto (attenzione, non una stringa vuota, ma un oggetto null.), il metodo println dell'oggetto out non può operare direttamente su un oggetto vuoto, quindi la pagina JSP nella sezione 1 del codice lancerà l'eccezione "Java.lang.NullPointerException". E anche se l'oggetto potrebbe essere vuoto, si chiamano alcuni metodi come toString(), equal(Object obj) dell'oggetto Java.lang.Object o Object stesso.

Codice sezione 2:

String userName = request.getParameter("username"); 
  Se (userName.equals("root")) 
  {....} 

Analisi:La funzione del codice sezione 2 è controllare il nome utente fornito dall'utente, se il nome utente è "root", allora si eseguiranno alcune operazioni speciali.

Spiegazione:Nel codice sezione 2, se un utente non fornisce il valore del campo del modulo "username", l'oggetto stringa userName è un valore null, non si può confrontare direttamente un oggetto null con un altro oggetto, allo stesso modo, la pagina JSP nella sezione 2 del codice lancerà un errore di puntatore nullo.

Un piccolo trucco:Se si desidera confrontare il valore di ritorno di un metodo con una costante, mettendo la costante davanti, si può evitare di chiamare il metodo equals di un oggetto null. Ad esempio: 

Se ("root".equals(userName)) 
  {....} 

Anche se l'oggetto userName restituisce un oggetto null, non ci sarà un'eccezione di puntatore nullo qui e può funzionare normalmente.

Segmento di codice 3:

String userName = session.getAttribute("session.username").toString(); 

Analisi:La funzione del segmento di codice 3 è di estrarre il valore di session.username dalla sessione e assegnarlo all'oggetto stringa userName.

Spiegazione:Di solito, se l'utente ha già effettuato una sessione, non ci saranno problemi; tuttavia, se l'app server si riavvia e l'utente non si è ricollegato (può anche essere che l'utente abbia chiuso il browser ma abbia lasciato aperta la pagina originale.), allora il valore della sessione diventerà invalido e il valore di session.username nella sessione diventerà vuoto. L'esecuzione diretta di toString() su un oggetto null causerebbe il sistema a lanciare un'eccezione di puntatore nullo.

Segmento di codice 4:

public static void main(String args[]){ 
Person p=null; 
p.setName("张三"); 
System.out.println(p.getName()); 
} 

Analisi:Dichiara un oggetto Person e stampa il nome "Name" dell'oggetto.

Spiegazione:In questo momento, il tuo p avrà un'eccezione di puntatore nullo perché hai solo dichiarato l'oggetto di tipo Person senza creare l'oggetto, quindi non c'è alcun riferimento all'indirizzo nel suo heap. Attenzione: quando utilizzi i metodi dell'oggetto, assicurati di creare l'oggetto.

A: Inizia a utilizzare l'oggetto indipendentemente dal fatto che sia vuoto o no.

(JSP) Segmento di codice 1:

out.println(request.getParameter("username"));

Analisi:La funzione del segmento di codice 1 è molto semplice, ovvero visualizzare il valore inserito dall'utente "username".

Spiegazione:Sembra che le frasi superiori non contengano errori grammaticali e, nella maggior parte dei casi, non si incontrano problemi. Tuttavia, se un utente non fornisce il valore del campo del modulo "username" durante l'inserimento dei dati o accede direttamente tramite un percorso diverso, il valore di request.getParameter("username") sarà vuoto (attenzione: non una stringa vuota, ma un oggetto nullo null.). Il metodo println dell'oggetto out non può operare direttamente su un oggetto vuoto, quindi la pagina JSP in cui si trova il segmento di codice 1 genererà un'eccezione "Java.lang.NullPointerException". E anche se l'oggetto potrebbe essere vuoto, si chiamano alcuni metodi dell'oggetto Java.lang.Object o Object stesso, come toString(), equal(Object obj) e altri.

Segmento di codice 2 (JSP):

String userName = request.getParameter("username");
  Se (userName.equals("root"))
{....}

Analisi:La funzione del segmento di codice 2 è controllare il nome utente fornito dall'utente; se il nome utente è "root", eseguire alcune operazioni speciali.

Spiegazione:Nel segmento di codice 2, se l'utente non fornisce il valore del dominio del modulo "username", l'oggetto stringa userName avrà un valore null, non sarà possibile confrontare direttamente un oggetto null con un altro oggetto, allo stesso modo, la pagina JSP nel segmento 2 lancerà l'errore (Java.lang.NullPointerException) eccezione di riferimento a zero.

Segmento di codice 3 (JSP):

String userName = session.getAttribute
("session.username").toString();

Analisi:La funzione del segmento di codice 3 è di estrarre il valore di session.username dalla sessione e assegnarlo all'oggetto stringa userName.

Spiegazione:Di solito, se l'utente ha già iniziato una sessione, non ci saranno problemi; ma se l'app server si riavvia e l'utente non si è ricollegato (può anche essere che l'utente abbia chiuso il browser ma abbia lasciato aperta la pagina originale.), allora il valore di questa sessione scadrà e il valore di session.username nella sessione diventerà vuoto. L'esecuzione diretta di toString() su un oggetto null causerà il lancio dell'eccezione (Java.lang.NullPointerException) eccezione di riferimento a zero.

Questo è tutto il contenuto che l'autore ha portato avanti per brevemente trattare l'eccezione di riferimento a zero della gestione delle eccezioni Java; spero che tutti possano sostenere il tutorial di urlania.~

Ti potrebbe interessare