[java] java 14 nullpointerexception 자세한 메시지가 없습니다

Java 14에는 많은 새로운 기능이 있습니다. 그중 하나가 NullPointerException에 자세한 메시지를 표시합니다. Java 14를 설치하고 클래스 아래에서 컴파일하고 실행하려고 시도했지만 자세한 메시지가 표시되지 않습니다. 아무것도 빠졌습니까? 도와주세요.

~/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)

제안 된 -XX : + ShowCodeDetailsInExceptionMessages 플래그를 java에 전달하고 있지만 자세한 메시지는 없습니다. 도와주세요.



답변

OpenJ9는 현재 JEP 358을 지원하지 않습니다 .

NullPointerException아직 구현되지 않은 확장 메시지

JEP 358 : 유용한 NullPointerExceptionsNullPointerExceptionJava 14 VM에서 a 를 생성하고 기능을 활성화 한 경우 확장 메시지를 제공 합니다. 그러나 현재로서는 OpenJ9에서 구현되지 않았습니다.

이 버그 에서 진행 상황을 추적

이 기능을 사용하려면 adoptopenjdk에서 핫스팟 변형을 다운로드하십시오. 현재 배포판과 동일한 공급 업체이므로 조금만 변경하면됩니다.


답변

OP가 예상 출력이 무엇인지 말하지 않았기 때문에 설명을 위해 여기에 보관하고 있습니다.

다음 예는 핫스팟 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());
        }
    }
}

이것은 단지 메시지를 보여주는 것 외에는 거의 같은 프로그램입니다.

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

없는

추가 인수로 실행할 때.

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

“”이 (가) null이므로 “String.length ()”를 호출 할 수 없습니다

이 인수는 핫스팟 jvm의 스택 추적에도 영향을줍니다.

추가 인수없이 실행할 때 :

예외 .main (Exceptional.java:6)의 “main”스레드 java.lang.NullPointerException 예외

그리고 인수로 실행하십시오.

“main”스레드 예외 java.lang.NullPointerException : 예외 “.main (Exceptional.java:6)에서” “가 널 (null)이므로”String.length () “를 호출 할 수 없습니다.

스택 추적에 이미 코드에 대한 추가 정보가 포함되어 있기 때문에 스택 추적이 변경되지 않을 수 있다고 잘못 생각했습니다. 다른 답변이 지적했듯이, openj9 jvm에서 해결되는 버그입니다.


답변