#Java 14 – dokładniejsze komunikaty dla klasycznego błędu NullPointerException


#Java 14 – dokładniejsze komunikaty dla klasycznego błędu NullPointerException

Java 14 przynosi zmianę która pozwala wyświetlić bardziej szczegółowe informacje w którym miejscu programu wystąpił klasyczny błąd NullPointerException. Przed wersją Javy 14 informacja o błędzie dostępna była tylko w zakresie linii w której wystąpił błąd. Od wersji 14 zmieniło się to! Zobaczmy przykład:

Klasa Employee:

class Employee {
 
    private String name;
    private String surname;
 
    public Employee(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }
 
    @Getter
    @Setter
    private List<Employee> subordinates;
}
  • Klasa Testowa – błąd NullPointerException występuje na poziomie dostępu do obiektu pracownika :
public class TestNullPointerExceptionInJava14 {
 
    @Getter
    private Employee employee;
 
    public static void main(String[] args) {
        System.out.println( new TestNullPointerExceptionInJava14().getEmployee().getSubordinates());
    }
}

wynik:

Exception in thread "main" java.lang.NullPointerException
	at pl.javaleader.java14.TestNullPointerExceptionInJava14.main(TestNullPointerExceptionInJava14.java:29)
  • Klasa Testowa – błąd NullPointerException występuje na poziomie dostępu do obiektu z listy podwładnych:
public class TestNullPointerExceptionInJava14 {
 
    @Getter
    private Employee employee = new Employee("James", "Spring");
 
    public static void main(String[] args) {
        System.out.println( new TestNullPointerExceptionInJava14().getEmployee().getSubordinates().get(0));
    }
}

wynik:

Exception in thread "main" java.lang.NullPointerException
	at pl.javaleader.java14.TestNullPointerExceptionInJava14.main(TestNullPointerExceptionInJava14.java:29)

W obydwu przypadkach informacje przed wersją Java 14 dotyczy tylko linii w której wystąpił błąd. Od wersji 14 dostępne są bardziej szczegółowe informacje. Zanim jednak przejdziemy dalej dodajemy obsługę szczegółowych komunikatów w środowisku IntelliJ IDEA:

Run -> Edit Configurations -> VM options:

-XX:+ShowCodeDetailsInExceptionMessages --enable-preview
  • wynik dla pierwszej klasy testowej:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "pl.javaleader.coronavirus.Employee.getSubordinates()" because the return value of "pl.javaleader.coronavirus.TestNullPointerExceptionInJava14.getEmployee()" is null
	at pl.javaleader.java14.TestNullPointerExceptionInJava14.main(TestNullPointerExceptionInJava14.java:29)
  • wynik dla drugiej klasy testowej:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.get(int)" because the return value of "pl.javaleader.coronavirus.Employee.getSubordinates()" is null
	at pl.javaleader.java14.TestNullPointerExceptionInJava14.main(TestNullPointerExceptionInJava14.java:29)

Komunikaty o błędach wyglądają znacznie lepiej, są bardziej szczegółowe i łatwiej jest wychwycić dlaczego program zwraca błąd NullPointerException.


Leave a comment

Your email address will not be published.


*