Co to jest NullPointerException ?
NullPointerException – to najpopularniejszy wyjątek w języku Java. Występuje on wtedy, gdy spróbujemy wywołać jakąś metodę (operację) na obiekcie, który jest null'e
. W kodzie możemy zaprezentować to w taki sposób:
Tworzymy zmienną, która wskazuje na null
Object myObject = null;
wywołujemy jakąkolwiek operację korzystając ze zmiennej myObject
:
myObject.toString();
otrzymujemy java.lang.NullPointerException
.
NullPointerException jest więc bezpośrednio wynikiem odwoływania się do obiektu, który nie istnieje. Często nie widać tego w kodzie źródłowym, ponieważ kod w całości się kompiluje, ale podczas działania programu obiekt może nie istnieć i zostaje zwrócony wyjątek. Pośrednio jest on wynikiem istnienia wartości null w języku Java.
Referencja null
została wynaleziona w latach 60-tych przez Tonego Hoare’a twórcę języka ALGOL i przez niego też nazwana „The Billion Dollar Mistake”. Podobnie można nazwać NullPointerException w języku Java, ponieważ ustrzeżenie się go wymaga wiele wysiłku (odsyłam do prezentacji Tonego Hoare’a Null References: The Billion Dollar Mistake).
Przez lata programiści i twórcy różnych języków programowania wymyślali różne sposoby by się go ustrzec:
- null check – sprawdzanie czy dana referencja nie wskazuje na
null
. W kodzie występuje jako instrukcjaif
z odpowiednim warunkiem.if (myOvject != null) { myOvject.toString(); }
- Wzorzec Null Object (Null Object Pattern) – zamiast referencji
null
ustawiamy pusty obiekt, który ma taki sam interfejs jak docelowy obiekt, ale jego metody nie robią nic. Dzięki temu jego zachowanie jest przewidywalne - Optional – w Javie 8 wprowadzono specjalny mechanizm pozwalający radzić sobie z problemem NullPointerException. Zamiast
null
wstawiamy specjalny obiekt Optional<T>, który może przechowywać wybrany typ lubnull
. Optional udostępnia nam specjalne metody.isPresent()
i.get()
, które pomagają na nim operować np:Optional<String> op = Optional.ofNullable(string); if(op.isPresent()) { op.get(); }
Niestety, żaden z powyższych sposobów nie jest idealny. Wszystkie z nich przysparzają programistom dużo dodatkowej pracy. Najlepszym rozwiązaniem byłoby wprowadzenie sprawdzania referencji null
na etapie kompilacji, tak jak zostało to rozwiązanie w języku Kotlin. Niestety w Javie chyba nie jest to możliwe, ponieważ łamałoby to kompatybilność wsteczną języka z której przecież Java słynie.
Skąd się wzięła nazwa strony NullPointeException.pl ?
Długo szukałem odpowiedniej nazwy dla strony, na której mógłbym dzielić się swoją wiedzą, a która byłaby na tyle uniwersalna, by w przyszłości rozwinąć ją w coś większego. Dni mijały a ja nadal pozostawałem bez odpowiedniej nazwy. W końcu nieubłaganie nadszedł czas decyzji i nadal nic ciekawego nie przychodziło mi do głowy. Pomyślałem, że brak pomysłu w mojej głowie to taki NullPointerException (w końcu od lat jestem programistą Javy i mimo doświadczenia nadal zmagam się z tym wyjątkiem na co dzień 🙂 ). Po chwili wydało mi się to nawet zabawne (chociaż nadal myślę, że z marketingowego punktu widzenia to słaba nazwa – ale życie pokaże). Chwilę pomyślałem nad tym i sprawdziłem, domena była dostępna. Od razu ją wykupiłem i po kilku dniach miałem już działającego bloga…
O czym jest ta strona ?
Głównie będę pisał o programowaniu w językach związanych z platformą JVM, bo Java to nie wszystko i czasem warto zobaczyć jak pewne rzeczy są rozwiązane w innych językach. W ten sposób poszerzamy sobie spojrzenie na problemy, które spotykają nas w codziennej pracy. Natomiast język Java będzie dominującym tematem w tym serwisie.
Nie zabraknie też ogólnych tematów związanych z programowaniem, takich jak obiektowość, wzorce projektowe czy algorytmy i struktury danych.