java 14 nullpointerexception aucun message détaillé


10

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.


Vous êtes-vous assuré que votre javacversion est 14?
RealSkeptic

2
Vous utilisez OpenJ9. Trouvé ce bug
Johannes Kuhn

Réponses:


8

OpenJ9 ne prend actuellement pas en charge JEP 358 :

Messages étendus pour NullPointerExceptionpas encore implémentés

JEP 358: NullPointerExceptions utiles fournit des messages étendus lorsqu'un NullPointerExceptionest généré par la machine virtuelle Java 14 et que vous avez activé la fonction. Cependant, sachez que cela n'est pas implémenté dans OpenJ9 pour le moment.

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.


Merci de l'avoir signalé. Ils auraient dû mentionner ce point dans les notes de publication d'OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9 est développé par Eclipse, pas Oracle.
Slaw

1
@Pradeep OpenJ9 n'est pas le même projet qu'OpenJDK.
Mark Rotteveel

-1

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.

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());
        }
    }
}

C'est à peu près le même programme, sauf qu'il ne fait que montrer le message.

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

nul

Lorsqu'il est exécuté avec l'argument supplémentaire.

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

Impossible d'appeler "String.length ()" car "" est nul

L'argument affecte également la trace de pile sur le hotspot jvm.

Lorsqu'il est exécuté sans l'argument supplémentaire:

Exception dans le thread "main" java.lang.NullPointerException at Exceptional.main (Exceptional.java:6)

Et exécutez avec l'argument:

Exception dans le thread "principal" java.lang.NullPointerException: impossible d'appeler "String.length ()" car "" est nul à Exceptional.main (Exceptional.java:6)

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.


1
Il ne répond pas POURQUOI op n'obtient aucune exception nullpointerexception utile. Juste un "Hé, vous pouvez obtenir le message dans votre code avec e.getMessage()".
Johannes Kuhn

@JohannesKuhn n'est-ce pas? Ils laissent la bulle d'exception jusqu'à une trace de pile où, comme l'argument modifie le message d'exceptions. Je montre donc que le message change.
mat

1
Le problème se situe ailleurs. Même si op exécuterait votre code, cela ne change pas le résultat (toujours nullcomme message)
Johannes Kuhn

1
Le message de 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.
kaya3

@ kaya3 true, je l'ai mis à jour pour inclure également le comportement de la version de trace de la pile.
mat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.