Java 14 possède de nombreuses nouvelles fonctionnalités. L'un d'eux affiche un message détaillé dans NullPointerException. J'ai installé Java 14 et j'essaie de compiler et d'exécuter ci-dessous la classe mais je ne reçois aucun message détaillé. Suis-je en train de manquer quelque chose? veuillez aider.
~/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)
Je passe l'indicateur -XX: + ShowCodeDetailsInExceptionMessages suggéré à java mais il n'y a pas de message détaillé. Veuillez aider.
javac
version est 14?Réponses:
OpenJ9 ne prend actuellement pas en charge JEP 358 :
La progression est suivie dans ce bug
Si vous souhaitez utiliser cette fonctionnalité, téléchargez la variante du hotspot depuis adoptopenjdk. C'est le même fournisseur que votre distribution actuelle, ce n'est donc qu'un petit changement.
la source
Je garde ceci ici pour clarification, puisque le PO n'a pas dit quel est le résultat attendu.
L'exemple suivant fonctionne car il utilise le hotspot jvm.
C'est à peu près le même programme, sauf qu'il ne fait que montrer le message.
Lorsqu'il est exécuté avec l'argument supplémentaire.
L'argument affecte également la trace de pile sur le hotspot jvm.
Lorsqu'il est exécuté sans l'argument supplémentaire:
Et exécutez avec l'argument:
J'ai pensé à tort que la trace de la pile pourrait ne pas changer car elle contient déjà des informations supplémentaires sur le code. Comme le souligne l'autre réponse, c'est un bogue qui est corrigé dans le jvm openj9.
la source
e.getMessage()
".null
comme message)e.getMessage()
devrait être le même que celui affiché dans la trace de la pile si vous n'attrapez pas l'exception - sauf si vous avez testé cela et observé une différence dans le message entre l'attraper et ne pas l'attraper, alors je ne pense pas l'attraper résout le problème dans la question.