Java: l’eccezione stessa è nulla

Sono abbastanza confuso che sia un problema Android o un problema Java.

Quando eseguivo il debug di un’applicazione Android che funziona con Bluetooth, il stream si fermava su un blocco catch di IOException in cui in seguito ho scoperto che l’eccezione e era nullo …. È stata generata quando stavo provando a leggere da un InputStream

Sì, non era un NullPointerException ma un altro tipo di eccezione che è null- Meglio dire gettato non inizializzato.

È ansible? In quale scenario possono essere generate eccezioni così unitarie?

Un'eccezione è nulla ... NON È UN'ECCEZIONE NULL POINTER

È ansible? In quale scenario possono essere generate eccezioni così unitarie?

Ciò non è ansible utilizzando un compilatore Java conforms e una macchina virtuale Java conforms, e per estensione una macchina virtuale Davlik conforms. Il JLS non consente alla variabile e di essere null in quella posizione

O hai una macchina virtuale buggata, un debugger bacato, o un problema con il tuo IDE, strumenti di sviluppo e / o processo.

Se fossi nella tua situazione, per ora FERMO di usare il debugger e ricomincio ad aggiungere traceprints vecchio stile al tuo codice. E assicurati di fare una compilazione pulita e completa dalla fonte.


Un’altra possibilità da considerare è che i numeri di riga che JRE sta segnalando in fase di esecuzione (e che il debugger fa affidamento su) non si allineano con i numeri di riga nel codice sorgente. Questo potrebbe accadere se hai commesso un errore nei tuoi processi di compilazione e implementazione. L’errore potrebbe essere qualcosa come dimenticare di salvare un file, dimenticando di build, dimenticando di distribuire la nuova versione dell’app o di non riuscire a sincronizzare l’IDE con il filesystem.


FWIW, la teoria è che questo è causato dal throw null; o qualcosa di equivalente non regge l’acqua. La sezione JLS 14.18 dice:

“Se la valutazione dell’Espressione viene completata normalmente, producendo un valore nullo, viene creata un’istanza V ‘della class NullPointerException e generata invece di null.”

È più facile capire se leggi quella frase nel suo contesto, ma sta dicendo chiaramente che throw null; effettivamente lancia una NullPointerException .


AGGIORNARE

Ho trovato un’altra spiegazione plausibile in questa domanda SO: l’ eccezione è sempre NULL

Fondamentalmente, sta dicendo che il codice emulato sta generando un’eccezione di cui Eclipse non sa nulla, e l’emulatore di Eclipse sta “utilmente” sostituendo un null . Sembra un bug di emulatore.

Probabilmente sarai ingannato dal tuo debugger.

Aggiungi un’altra linea di codice sotto quella linea (qualcosa di non utile come if(false) log.v("",""); ), interrompi il controllo e da lì il valore della tua eccezione.

Prova anche Log.e(TAG, "my null exception", e); e leggere il registro.

Non sono sicuro che sia lo stesso problema ma ho già risposto a una domanda simile … Se succede quando provi a leggere da un InputStream, dai un’occhiata a questo link …

Problema di connessione Bluetooth Android

In Java, puoi lanciare una NullPointerException lanciando null . In questo caso, il throwable sarà in definitiva una NullPointerException .

 public static void main(String[] args) { try{ a(null); } catch(Exception e) { System.out.println(e); e.printStackTrace(); } } public static void a(String[] args) { throw null; } 

Produzione:

 java.lang.NullPointerException java.lang.NullPointerException at scjp.Scjp.a(Scjp.java:18) at scjp.Scjp.main(Scjp.java:8)