5

A meno che non vi sia un codice simile, i puntatori nulli throw new NullPointerException(); si verificano in genere quando viene utilizzata un'espressione che risulta essere null. Quindi, la mia domanda è, perché il messaggio per il puntatore nullo non contiene l'espressione che restituisce null?perché l'eccezione puntatore nullo non fornisce l'espressione null?

+3

Potresti postare qualche esempio per illustrare cosa stai cercando di chiedere? La traccia di stack fornisce il numero di riga in cui si verifica l'eccezione. –

+1

Di fronte alle ottimizzazioni, ecc, tutto ciò che di solito è noto al runtime è "questa cosa che doveva essere un riferimento è in realtà' null' ". Tale riferimento potrebbe essere stato calcolato altrove, in qualsiasi momento nel passato. –

risposta

4

Non so per certo, ma immagino che il motivo potrebbe essere che ci potrebbero essere problemi di prestazioni importanti se la JVM dovesse essere in grado di riportare l'espressione precisa che ha gettato l'eccezione.

Per lo meno, richiederebbe modifiche al formato del file di classe per includere informazioni di posizione del codice sorgente (veramente) finemente granulose ... più fini rispetto ai numeri di riga.

In ogni caso, la domanda è discutibile ... perché non lo è.

+0

Solo perché java è un linguaggio di programmazione, non smetterei di mettere in discussione la sua implementazione! – MozenRath

+0

@MozenRath - Beh, se vuoi una risposta vera, stai chiedendo alle persone sbagliate. Chiedi al team di Java. OTOH, se stai effettivamente "mettendo in discussione" Java (cioè criticandolo), allora SO non è un posto appropriato per farlo; vedi le FAQ. –

+0

Ho capito .. grazie però! – MozenRath

4

NullPointerException si verifica quando si tenta di dereferenziare un null, non quando lo si crea o ne ha uno solo. La traccia di stack contiene la linea, e questo è buono come si ottiene, e JVM non sa da dove viene il null, non tiene traccia di tali cose quando cerca di sfogliare il bytecode il più velocemente possibile.


In caso di problemi di debug tali situazioni, si può sempre diviso variabile espressione e l'uso temporaneo:

String tmp = myObj.getSomething(); 
String result = tmp.substring(1); 

Se prima linea di cui sopra getta NullPointerException (con traccia dello stack che mostra è venuto da quella linea, non dall'interno myObj.getSomething()), sai che myObj era nullo. Se la seconda riga lancia NullPointerException, lo tmp è nullo, ovvero myObj.getSomething() restituito null. Se si nota quindi che myObj.getSomething() può effettivamente restituire null in una situazione normale, è possibile aggiungere quindi il tipo di codice if (tmp != null) { ... } else { ... }.

+1

Detto abbastanza: traccia dello stack. –

Problemi correlati