O Java 14 tem muitos novos recursos. Um deles está mostrando mensagem detalhada em NullPointerException. Instalei o Java 14 e estou tentando compilar e executar abaixo da classe, mas não estou recebendo nenhuma mensagem detalhada. Estou faltando alguma coisa? por favor ajude.
~/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)
Estou passando o sinalizador -XX: + ShowCodeDetailsInExceptionMessages para java, mas não há mensagem detalhada. Por favor ajude.
javac
versão é 14?Respostas:
O OpenJ9 atualmente não suporta o JEP 358 :
O progresso é rastreado neste bug
Se você deseja usar esse recurso, faça o download da variante do ponto de acesso em adoptopenjdk. É o mesmo fornecedor da sua distribuição atual, portanto, essa é apenas uma pequena alteração.
fonte
Estou mantendo isso aqui para esclarecimentos, pois o OP não disse qual é o resultado esperado.
O exemplo a seguir funciona porque está usando o hotspot jvm.
Este é praticamente o mesmo programa, exceto que está apenas mostrando a mensagem.
Quando executado com o argumento adicional.
O argumento também afeta o rastreamento de pilha na jvm do ponto de acesso.
Quando executado sem o argumento adicional:
E corra com o argumento:
Eu pensei incorretamente que o rastreamento de pilha não pode ser alterado porque já inclui informações adicionais sobre o código. Como a outra resposta aponta, é um bug que está sendo resolvido na openj9 jvm.
fonte
e.getMessage()
".null
como mensagem)e.getMessage()
deve ser a mesma mostrada no rastreamento da pilha, se você não capturar a exceção - a menos que você tenha testado isso e observado uma diferença na mensagem entre capturá-lo e não capturá-lo, acho que não. pegá-lo aborda o problema na pergunta.