java 14 nullpointerexception ayrıntılı mesaj yok


10

Java 14 birçok yeni özelliğe sahiptir. Bunlardan biri NullPointerException içinde ayrıntılı mesaj gösteriyor. Java 14'ü yükledim ve derlemeyi ve sınıfın altında çalışmayı denedim, ancak ayrıntılı bir mesaj almıyorum. Bir şey mi kaçırıyorum? lütfen yardım et.

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

Java için önerilen -XX: + ShowCodeDetailsInExceptionMessages bayrağı geçiyorum ama ayrıntılı bir ileti yok. Lütfen yardım et.


javacSürüm 14'ün olduğundan emin misiniz ?
RealSkeptic

2
OpenJ9 kullanıyorsunuz. Bulunan bu hatayı
Johannes Kuhn

Yanıtlar:


8

OpenJ9 şu anda JEP 358'i desteklememektedir :

NullPointerExceptionHenüz uygulanmayanlar için genişletilmiş mesajlar

JEP 358: Yararlı NullPointerExceptionsNullPointerException , Java 14 VM tarafından bir üretildiğinde ve özelliği etkinleştirdiğinizde genişletilmiş mesajlar sağlar . Ancak, bunun şu anda OpenJ9'da uygulanmadığını unutmayın.

İlerleme durumu bu hatada izlenir

Bu özelliği kullanmak istiyorsanız, hotspot değişkenini adoptopenjdk'den indirin. Mevcut dağıtımınızla aynı satıcıdır, bu nedenle bu sadece küçük bir değişikliktir.


Bunu işaret ettiğiniz için teşekkürler. Bu noktayı OpenJDK sürüm notlarında belirtmeliydiler. openjdk.java.net/projects/jdk/14
Pradeep

2
@Pradeep OpenJ9, Oracle tarafından değil Eclipse tarafından geliştirilmiştir.
Lahana Salatası

1
@Pradeep OpenJ9, OpenJDK ile aynı proje değildir.
Mark Rotteveel

-1

Bunu burada açıklığa kavuşturmak için saklıyorum.

Aşağıdaki örnek hotspot jvm kullandığından çalışır.

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());
        }
    }
}

Bu sadece aynı mesajı gösteriyor, sadece mesajı gösteriyor.

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

boş

Ek argüman ile çalıştırıldığında.

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

"" Boş olduğu için "String.length ()" çağırılamıyor

Argüman ayrıca etkin nokta jvm'sindeki yığın izini de etkiler.

Ek argüman olmadan çalıştırıldığında:

Exceptional.main (exceptional.java:6) adresindeki "main" iş parçacığındaki özel durum java.lang.NullPointerException

Ve şu argümanla çalıştırın:

"Main" iş parçacığında kural dışı durum java.lang.NullPointerException: Exceptional.main (Exceptional.java:6) öğesinde "" boş olduğu için "String.length ()" çağırılamıyor

Yanlış kod zaten ek bilgi içerdiğinden yığın izleme değişmeyebilir düşündüm. Diğer yanıtın belirttiği gibi, openj9 jvm'de ele alınan bir hatadır.


1
NEDEN op herhangi bir yararlı nullpointerexception almaz cevap vermez. Sadece "Hey, mesajı kodunuza alabilirsiniz e.getMessage()".
Johannes Kuhn

@JohannesKuhn olsa değil mi? Kural dışı durumun özel durum iletisini değiştirdiği gibi, istisna balonunun yığın izlemesine kadar gitmesine izin veriyorlar. Bu yüzden mesajın değiştiğini gösteriyorum.
matt

1
Sorun başka bir yerde yatıyor. Op kodunuzu çalıştırsa bile, sonucu değiştirmez (her zaman nullmesaj olarak)
Johannes Kuhn

1
e.getMessage()İstisnayı yakalamazsanız gelen mesaj yığın izinde gösterilenle aynı olmalıdır - bunu test etmediyseniz ve yakalamakla yakalamak arasında mesajda bir fark gözlemlemediyseniz, o zaman sanmıyorum onu yakalamak sorudaki sorunu giderir.
kaya3

@ kaya3 true, ben de yığın izleme sürümü davranışını içerecek şekilde güncelledim.
matt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.