java 14 nullpointerexception nenhuma mensagem detalhada


10

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.


Você se certificou de que sua javacversão é 14?
RealSkeptic

2
Você está usando o OpenJ9. Encontrado este bug
Johannes Kuhn

Respostas:


8

O OpenJ9 atualmente não suporta o JEP 358 :

Mensagens estendidas para NullPointerExceptionainda não implementadas

JEP 358: NullPointerExceptions útil fornece mensagens estendidas quando a NullPointerExceptioné gerado pela Java 14 VM e você ativou o recurso. No entanto, esteja ciente de que isso não está implementado no OpenJ9 no momento.

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.


Obrigado por apontar isso. Eles deveriam ter mencionado esse ponto nas notas de versão do OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep

2
O @Pradeep OpenJ9 é desenvolvido pela Eclipse, não pela Oracle.
Slaw

11
@Pradeep OpenJ9 não é o mesmo projeto que o OpenJDK.
Mark Rotteveel

-1

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.

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

Este é praticamente o mesmo programa, exceto que está apenas mostrando a mensagem.

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

nulo

Quando executado com o argumento adicional.

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

Não é possível invocar "String.length ()" porque "" é nulo

O argumento também afeta o rastreamento de pilha na jvm do ponto de acesso.

Quando executado sem o argumento adicional:

Exceção no encadeamento "main" java.lang.NullPointerException at Exceptional.main (Exceptional.java:6)

E corra com o argumento:

Exceção no encadeamento "main" java.lang.NullPointerException: Não é possível invocar "String.length ()" porque "" é nulo em Exceptional.main (Exceptional.java:6)

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.


11
Ele não responde POR QUE op não recebe nenhuma nulopointerexception útil. Apenas um "Ei, você pode receber a mensagem no seu código com e.getMessage()".
Johannes Kuhn

@JohannesKuhn, não é? Eles estão deixando a exceção borbulhar até um rastreamento de pilha, enquanto o argumento está modificando a mensagem de exceções. Então, eu estou mostrando que a mensagem está sendo alterada.
matt

11
O problema está em outro lugar. Mesmo que o op execute seu código, ele não altera o resultado (sempre nullcomo mensagem)
Johannes Kuhn

11
A mensagem de 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.
kaya3 5/04

@ kaya3 true, atualizei-o para incluir também o comportamento da versão de rastreamento de pilha.
matt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.