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: NullPointerExceptions ที่เป็นประโยชน์จัดเตรียมข้อความเพิ่มเติมเมื่อNullPointerExceptionสร้างขึ้นโดย Java 14 VM และคุณเปิดใช้งานคุณลักษณะ อย่างไรก็ตามโปรดทราบว่าขณะนี้ยังไม่มีการใช้งานใน OpenJ9

ความคืบหน้าการติดตามในข้อผิดพลาดนี้

หากคุณต้องการใช้คุณสมบัตินี้ให้ดาวน์โหลดชุดตัวเลือกฮอตสปอตจาก adopttopenjdk เป็นผู้จำหน่ายรายเดียวกับการกระจายปัจจุบันของคุณดังนั้นนี่เป็นการเปลี่ยนแปลงเพียงเล็กน้อยเท่านั้น


ขอบคุณสำหรับการชี้สิ่งนี้ พวกเขาควรจะกล่าวถึงประเด็นนี้ในบันทึกประจำรุ่นของ OpenJDK openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9 พัฒนาโดย Eclipse ไม่ใช่ Oracle
Slaw

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

ไม่สามารถเรียกใช้ "String.length ()" เพราะ "" เป็นโมฆะ

อาร์กิวเมนต์ยังมีผลต่อ stacktrace บนฮอตสปอต jvm

เมื่อรันโดยไม่มีอาร์กิวเมนต์เพิ่มเติม:

ข้อยกเว้นในเธรด "main" java.lang.NullPointerException ที่ Exceptional.main (Exceptional.java:6)

และเรียกใช้ด้วยอาร์กิวเมนต์:

ข้อยกเว้นในเธรด "main" java.lang.NullPointerException: ไม่สามารถเรียกใช้ "String.length ()" เพราะ "" เป็นโมฆะที่ Exceptional.main (Exceptional.java:6)

ฉันคิดว่าการติดตามสแต็กอาจไม่เปลี่ยนแปลงอย่างไม่ถูกต้องเนื่องจากมีข้อมูลเพิ่มเติมเกี่ยวกับรหัสอยู่แล้ว ในขณะที่คำตอบอื่น ๆ ชี้ให้เห็นมันเป็นข้อผิดพลาดที่ถูกแก้ไขใน openj9 jvm


1
มันไม่ตอบว่าทำไม op ไม่ได้รับ nullpointerexception ใด ๆ ที่เป็นประโยชน์ เพียงแค่ "เฮ้คุณสามารถรับข้อความในรหัสด้วยe.getMessage()"
โยฮันน์คุห์น

@JohannesKuhn ไม่ได้ใช่มั้ย พวกมันปล่อยให้บับเบิลการยกเว้นขึ้นไปที่การติดตามสแต็กโดยที่อาร์กิวเมนต์กำลังแก้ไขข้อความข้อยกเว้น ดังนั้นฉันกำลังแสดงให้เห็นว่าข้อความมีการเปลี่ยนแปลง
แมตต์

1
ปัญหาอยู่ที่อื่น แม้ว่าสหกรณ์จะเรียกใช้รหัสของคุณก็จะไม่เปลี่ยนแปลงผล (เสมอnullเป็นข้อความ)
โยฮันเน Kuhn

1
ข้อความจากe.getMessage()ควรเป็นข้อความเดียวกับที่แสดงในการติดตามสแต็กหากคุณไม่ได้รับการยกเว้น - เว้นแต่คุณได้ทดสอบและสังเกตเห็นความแตกต่างของข้อความระหว่างการจับมันและไม่จับมันแล้วฉันไม่คิดว่า จับมันแก้ไขปัญหาในคำถาม
kaya3

@ kaya3 จริงฉันได้อัปเดตเพื่อรวมลักษณะการทำงานของเวอร์ชันการติดตามสแต็กด้วย
แมตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.