java 14 nullpointerexception tidak ada pesan terperinci

10

Java 14 memiliki banyak fitur baru. Salah satunya adalah menampilkan pesan terperinci di NullPointerException. Saya menginstal Java 14 dan mencoba untuk mengkompilasi dan menjalankan di bawah kelas tetapi saya tidak mendapatkan pesan rinci. Apakah saya kehilangan sesuatu? tolong bantu.

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

Saya lewat menyarankan flag -XX: + ShowCodeDetailsInExceptionMessages ke java tetapi tidak ada pesan terperinci. Tolong bantu.

Pradeep
sumber
Sudahkah Anda memastikan bahwa Anda javacadalah versi 14?
RealSkeptic
2
Anda menggunakan OpenJ9. Menemukan bug ini
Johannes Kuhn

Jawaban:

8

OpenJ9 saat ini tidak mendukung JEP 358 :

Pesan yang diperluas untuk yang NullPointerExceptionbelum diimplementasikan

JEP 358: Helpful NullPointerExceptions menyediakan pesan tambahan ketika a NullPointerExceptiondibuat oleh Java 14 VM dan Anda telah mengaktifkan fitur. Namun, ketahuilah bahwa ini tidak diterapkan di OpenJ9 saat ini.

Kemajuan dilacak dalam bug ini

Jika Anda ingin menggunakan fitur ini, unduh varian hotspot dari adoptopenjdk. Ini vendor yang sama dengan distribusi Anda saat ini, jadi ini hanya perubahan kecil.

Johannes Kuhn
sumber
Terima kasih telah menunjukkan ini. Mereka seharusnya menyebutkan poin ini dalam catatan rilis OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep
2
@Pradeep OpenJ9 dikembangkan oleh Eclipse, bukan Oracle.
Slaw
1
@Pradeep OpenJ9 bukan proyek yang sama dengan OpenJDK.
Mark Rotteveel
-1

Saya menyimpan ini di sini untuk klarifikasi, karena OP tidak mengatakan apa output yang diharapkan.

Contoh berikut berfungsi karena menggunakan 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());
        }
    }
}

Program ini hampir sama, kecuali hanya menunjukkan pesannya saja.

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

batal

Saat dijalankan dengan argumen tambahan.

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

Tidak dapat memanggil "String.length ()" karena "" adalah nol

Argumen ini juga memengaruhi stacktrace pada hotspot jvm.

Saat dijalankan tanpa argumen tambahan:

Pengecualian di utas "utama" java.lang.NullPointerException di Exceptional.main (Exceptional.java:6)

Dan jalankan dengan argumen:

Pengecualian di utas "utama" java.lang.NullPointerException: Tidak dapat memanggil "String.length ()" karena "" adalah nol di Exceptional.main (Exceptional.java:6)

Saya salah mengira jejak stack mungkin tidak berubah karena sudah menyertakan informasi tambahan tentang kode. Seperti jawaban lain tunjukkan, itu adalah bug yang sedang ditangani di openj9 jvm.

matt
sumber
1
Itu tidak menjawab MENGAPA op tidak mendapatkan nullpointerexception bermanfaat. Hanya dengan "Hei, Anda bisa mendapatkan pesan dalam kode Anda dengan e.getMessage()".
Johannes Kuhn
@JohannesKuhn bukan? Mereka membiarkan gelembung pengecualian hingga jejak stack di mana sebagai argumen memodifikasi pesan pengecualian. Jadi saya menunjukkan bahwa pesannya semakin berubah.
matt
1
Masalahnya terletak di tempat lain. Bahkan jika op akan menjalankan kode Anda, itu tidak mengubah hasil (selalu nullsebagai pesan)
Johannes Kuhn
1
Pesan dari e.getMessage()harus sama dengan yang ditampilkan di jejak tumpukan jika Anda tidak menangkap pengecualian - kecuali Anda telah menguji ini dan mengamati perbedaan dalam pesan antara menangkap dan tidak menangkapnya, maka saya tidak berpikir menangkapnya mengatasi masalah dalam pertanyaan.
kaya3
@ kaya3 benar, saya memperbaruinya untuk memasukkan perilaku versi stack stack juga.
matt