Java 14 nullpointerexception詳細メッセージなし


10

Java 14には多くの新機能があります。それらの1つは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:NullPointerException Java 14 VMによってが生成され、機能を有効にすると、役立つNullPointerExceptionsが拡張メッセージを提供します。ただし、現時点ではOpenJ9に実装されていないことに注意してください。

進行状況はこのバグで追跡されます

この機能を使用する場合は、adoptopenjdkからホットスポットバリアントをダウンロードしてください。現在のディストリビューションと同じベンダーなので、これはほんの小さな変更です。


これを指摘してくれてありがとう。この点については、OpenJDKのリリースノートで説明されているはずです。openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9はOracleではなくEclipseによって開発されています。
スロー

1
@Pradeep OpenJ9はOpenJDKと同じプロジェクトではありません。
Mark Rotteveel

-1

OPは予想される出力が何であるかを述べなかったので、ここでは説明のためにこれを保持します。

次の例は、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());
        }
    }
}

これは、メッセージを表示するだけであることを除いて、ほとんど同じプログラムです。

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

ヌル

追加の引数を指定して実行した場合。

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

「」がnullであるため、「String.length()」を呼び出せません

引数は、ホットスポットjvmのスタックトレースにも影響します。

追加の引数なしで実行すると:

スレッド "main"での例外java.lang.NullPointerException at Exceptional.main(Exceptional.java:6)

そして、引数を付けて実行します:

スレッド "main"の例外java.lang.NullPointerException:Exceptional.main(Exceptional.java:6)で ""がnullであるため、 "String.length()"を呼び出せません

スタックトレースにはコードに関する追加情報がすでに含まれているため、変更されない可能性があると誤って考えました。他の回答が指摘するように、openj9 jvmで対処されているのはバグです。


1
opが有用なnullpointerexceptionを取得しない理由を答えません。ちょうど「ねえ、あなたはあなたのコードでメッセージを得ることができますe.getMessage()」。
ヨハネスクーン

@JohannesKuhnはそれをしませんか?引数が例外メッセージを変更しているスタックトレースまで例外をバブルさせています。したがって、メッセージが変更されていることを示しています。
マット

1
問題はどこかにあります。opがコードを実行しても、結果は変わりません(常にnullメッセージとして)
Johannes Kuhn

1
からのメッセージはe.getMessage()、例外をキャッチしない場合、スタックトレースに表示されるものと同じである必要があります。これをテストし、キャッチすることとキャッチしないことの間のメッセージの違いを確認しない限り、私は思いませんそれを捕まえることは問題の問題に対処します。
kaya3

@ kaya3 true、スタックトレースバージョンの動作も含めるように更新しました。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.