java 14 nullpceptionexception không có thông báo chi tiết


10

Java 14 có nhiều tính năng mới. Một trong số đó là hiển thị thông báo chi tiết trong NullPulumException. Tôi đã cài đặt Java 14 và cố gắng biên dịch và chạy bên dưới lớp nhưng tôi không nhận được bất kỳ thông báo chi tiết nào. Tôi có thiếu thứ gì không? xin vui lòng giúp đỡ.

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

Tôi đang chuyển cờ -XX: + ShowCodeDetailsInExceptionMessages cho java nhưng không có thông báo chi tiết. Xin vui lòng giúp đỡ.


Bạn đã chắc chắn rằng javacphiên bản 14 của bạn chưa?
RealSkeptic

2
Bạn đang sử dụng OpenJ9. Tìm thấy lỗi này
Johannes Kuhn

Câu trả lời:


8

OpenJ9 hiện không hỗ trợ JEP 358 :

Tin nhắn mở rộng NullPointerExceptionchưa được triển khai

JEP 358: NullPulumExceptions hữu ích cung cấp các thông báo mở rộng khi NullPointerExceptionđược tạo bởi máy ảo Java 14 và bạn đã kích hoạt tính năng này. Tuy nhiên, hãy lưu ý rằng điều này không được triển khai trong OpenJ9 tại thời điểm này.

Tiến trình được theo dõi trong lỗi này

Nếu bạn muốn sử dụng tính năng này, hãy tải xuống biến thể hotspot từ việc áp dụng. Đó là nhà cung cấp giống như phân phối hiện tại của bạn, vì vậy đây chỉ là một thay đổi nhỏ.


Cảm ơn đã chỉ ra điều này. Họ nên đã đề cập đến điểm này trong ghi chú phát hành OpenJDK. openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9 được phát triển bởi Eclipse, không phải Oracle.
Slaw

1
@Pradeep OpenJ9 không giống dự án với OpenJDK.
Đánh dấu Rotteveel

-1

Tôi đang giữ điều này ở đây để làm rõ, vì OP không cho biết sản lượng dự kiến ​​là gì.

Ví dụ sau hoạt động vì nó đang sử dụng 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());
        }
    }
}

Đây là khá nhiều chương trình tương tự, ngoại trừ nó chỉ hiển thị thông báo.

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

vô giá trị

Khi chạy với đối số bổ sung.

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

Không thể gọi "String.length ()" vì "" là null

Đối số cũng ảnh hưởng đến stacktrace trên hotspot jvm.

Khi chạy mà không có đối số bổ sung:

Ngoại lệ trong luồng "chính" java.lang.NullPulumException tại Extra.main (Extra.java:6)

Và chạy với đối số:

Ngoại lệ trong luồng "chính" java.lang.NullPulumException: Không thể gọi "String.length ()" bởi vì "" là null tại Extra.main (Extra.java:6)

Tôi nghĩ không chính xác dấu vết ngăn xếp có thể không thay đổi vì nó đã bao gồm thông tin bổ sung về mã. Như câu trả lời khác chỉ ra, đó là một lỗi đang được xử lý trong openj9 jvm.


1
Nó không trả lời TẠI SAO op không nhận được bất kỳ nullpexexex hữu ích nào. Chỉ cần "Này, bạn có thể nhận được thông báo trong mã của mình e.getMessage()".
Julian Kuhn

@JohannesKuhn không? Họ đang để bong bóng ngoại lệ lên đến một dấu vết ngăn xếp trong đó đối số đang sửa đổi thông báo ngoại lệ. Vì vậy, tôi đang cho thấy rằng thông điệp đang được thay đổi.
matt

1
Vấn đề nằm ở một nơi khác. Ngay cả khi op sẽ chạy mã của bạn, nó vẫn không thay đổi kết quả (luôn luôn nulllà tin nhắn)
Johannes Kuhn

1
Thông báo từ e.getMessage()phải giống với thông báo được hiển thị trong dấu vết ngăn xếp nếu bạn không bắt được ngoại lệ - trừ khi bạn đã kiểm tra điều này và quan sát thấy sự khác biệt trong thông báo giữa việc bắt nó so với không bắt nó, thì tôi không nghĩ bắt nó giải quyết vấn đề trong câu hỏi.
kaya3

@ kaya3 đúng, tôi cũng cập nhật nó để bao gồm cả hành vi của phiên bản theo dõi ngăn xếp.
matt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.