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


10

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에 전달하고 있지만 자세한 메시지는 없습니다. 도와주세요.


javac버전 14 인지 확인 했습니까 ?
RealSkeptic

2
OpenJ9를 사용하고 있습니다. 이 버그를
Johannes Kuhn

답변:


8

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

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

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

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

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


이것을 지적 해 주셔서 감사합니다. OpenJDK 릴리스 노트에서이 점을 언급 했어야합니다. openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9는 Oracle이 아닌 Eclipse에서 개발되었습니다.
양배추

1
@Pradeep OpenJ9는 OpenJDK와 동일한 프로젝트가 아닙니다.
Mark Rotteveel

-1

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에서 해결되는 버그입니다.


1
op가 유용한 nullpointerexception을 얻지 못하는 이유는 대답하지 않습니다. "이봐, 당신은 e.getMessage()"로 코드에서 메시지를 얻을 수 있습니다 .
Johannes Kuhn

@JohannesKuhn 님이 아닌가요? 인수가 예외 메시지를 수정하는 경우 스택 추적까지 예외 버블을 허용합니다. 그래서 메시지가 바뀌고 있음을 보여주고 있습니다.
매트

1
문제는 다른 곳에 있습니다. op가 코드를 실행하더라도 결과는 변경되지 않습니다 (항상 null메시지)
Johannes Kuhn

1
메시지를 e.getMessage()예외를 잡지 않으면 스택 추적에 표시된 것과 동일해야합니다.이를 테스트하지 않고 메시지를 잡는 것과 잡지 않는 것의 메시지의 차이를 관찰하지 않는 한, 생각하지 않습니다. 그것을 잡으면 문제의 문제를 해결합니다.
kaya3

@ kaya3 true, 스택 추적 버전의 동작도 포함하도록 업데이트했습니다.
매트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.