java 14 nullpointerexception nessun messaggio dettagliato


10

Java 14 ha molte nuove funzionalità. Uno di questi sta mostrando un messaggio dettagliato in NullPointerException. Ho installato Java 14 e ho provato a compilare ed eseguire una classe inferiore ma non ricevo alcun messaggio dettagliato. Mi sto perdendo qualcosa? per favore aiuto.

~/code/demo/temp$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment AdoptOpenJDK (build 14+36)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.19.0, JRE 14 Mac OS X amd64-64-Bit Compressed          References 20200313_47 (JIT enabled, AOT enabled)
OpenJ9   - 0133ba037
OMR      - 1c04e0ef9
JCL      - a73be60649 based on jdk-14+36)

~/code/demo/temp$ cat Hello.java
public class Hello {
  public static void main(String args[]) {
    String a = null;
    System.out.println(a.length());
  }
}

~/code/demo/temp$ javac Hello.java
~/code/demo/temp$ java -XX:+ShowCodeDetailsInExceptionMessages Hello
Exception in thread "main" java.lang.NullPointerException
at Hello.main(Hello.java:4)

Sto passando suggerito -XX: + ShowCodeDetailsInExceptionMessages contrassegna java ma non è presente alcun messaggio dettagliato. Per favore aiuto.


Hai fatto in modo che la tua javacsia la versione 14?
RealSkeptic,

2
Stai usando OpenJ9. Trovato questo errore
Johannes Kuhn il

Risposte:


8

OpenJ9 attualmente non supporta JEP 358 :

Messaggi estesi per NullPointerExceptionnon ancora implementati

JEP 358: NullPointerExceptions utile fornisce messaggi estesi quando un NullPointerExceptionviene generato dalla VM Java 14 e si è abilitata la funzione. Tuttavia, tieni presente che questo non è implementato in OpenJ9 al momento.

L'avanzamento viene monitorato in questo errore

Se si desidera utilizzare questa funzione, scaricare la variante di hotspot da adoptopenjdk. È lo stesso fornitore della tua attuale distribuzione, quindi questa è solo una piccola modifica.


Grazie per averlo indicato. Avrebbero dovuto menzionare questo punto nelle note di rilascio di OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9 è sviluppato da Eclipse, non da Oracle.
Slaw

1
@Pradeep OpenJ9 non è lo stesso progetto di OpenJDK.
Mark Rotteveel,

-1

Lo tengo qui per chiarimenti, dal momento che l'OP non ha detto quale sia il risultato atteso.

L'esempio seguente funziona perché utilizza l'hotspot jvm.

public class Exceptional{
    public static void main(String[] args){
        String a = null;
        try{
            System.out.println(a.length());
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

Questo è praticamente lo stesso programma, tranne per il fatto che mostra solo il messaggio.

~/local/jdk-14+36/bin/java Exceptional.java 

nullo

Quando eseguito con l'argomento aggiuntivo.

 ~/local/jdk-14+36/bin/java -XX:+ShowCodeDetailsInExceptionMessages Exceptional.java

Impossibile richiamare "String.length ()" perché "" è nullo

L'argomento influenza anche lo stacktrace sull'hotspot jvm.

Quando eseguito senza l'argomento aggiuntivo:

Eccezione nel thread "main" java.lang.NullPointerException at Exceptional.main (Exceptional.java:6)

E corri con l'argomento:

Eccezione nel thread "main" java.lang.NullPointerException: impossibile richiamare "String.length ()" perché "" è null su Exceptional.main (Exceptional.java:6)

Ho erroneamente pensato che la traccia dello stack potrebbe non cambiare perché include già ulteriori informazioni sul codice. Come sottolinea l'altra risposta, si tratta di un bug che viene risolto nel jvm openj9.


1
Non risponde PERCHÉ op non riceve alcuna nullpointerexception utile. Solo un "Ehi, puoi ottenere il messaggio nel tuo codice con e.getMessage()".
Johannes Kuhn,

@JohannesKuhn non è vero? Stanno lasciando che l'eccezione rimbalzi su una traccia dello stack in cui l'argomento modifica il messaggio delle eccezioni. Quindi sto mostrando che il messaggio sta cambiando.
matt

1
Il problema sta altrove. Anche se op eseguirà il tuo codice, non cambierà il risultato (sempre nullcome messaggio)
Johannes Kuhn,

1
Il messaggio da e.getMessage()dovrebbe essere lo stesso mostrato nella traccia dello stack se non si rileva l'eccezione, a meno che non sia stato testato e osservato una differenza nel messaggio tra catturarlo e non catturarlo, quindi non credo catturarlo risolve il problema nella domanda.
kaya3,

@ kaya3 true, l'ho aggiornato per includere anche il comportamento della versione dello stack stack.
matt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.