#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