Dzisiejszy wpis, będzie szczególnie przydatny w codziennej pracy z kodem. W szczególności, gdy pojawiają się problemy z uruchomieniem dopiero co napisanego kodu. A gdy jesteś dopiero na początku swojej programistycznej to potrafi przytłoczyć. Dlatego śpieszymy z pomocą i pokazujemy, co zrobić, by “naprawić” kod.
Ten wpis dedykujemy w szczególności początkującym programistom, jednak zebrane przez artykuły mogą się przydać niezależnie od Twojego stażu.
Po pierwsze, nie panikuj
Musisz się przyzwyczaić, że praca programisty polega na pracy z kodem, który się nie uruchamia :) Wie, wiem, łatwo mi to teraz mówić, ale na początku mojej nauki pamiętam jak error potrafił mnie skutecznie zniechęcić do dalszego programowania, czy myślenia, o tym, czemu to nie działa. Po prostu, nie wiedziałam, co robić. Rozwiązanie jest jednak prostsze niż myślisz… Sprawdź, co masz na konsoli. Wiemy, czasem to może być istna kaskada wyjątków, ale my potrzebujemy tylko jednego. Wyjątek, który jest najniżej jest przyczyną Twojego problemu i nim będziemy się zajmować.
Po drugie, zrozum, co to oznacza
W miarę zdobywania programistycznego doświadczenia, pojawienie się pewnych wyjątków, będzie miało dla Ciebie oczywiste źródła. Jednak czasem możesz nie wiedzieć, co one oznaczają. Co wtedy? Po prostu skopiuj go do google’a i sprawdź, co oznacza. Tutaj polecamy 1.oficjalną dokumentacje(tutaj linki do dokumentacji Javy i Springa) lub 2. StackOverflow. Rekomendujemy nauczenie się pracy z dokumentacją, ponieważ bardzo ułatwi nam to czytanie komunikatów o błędach i znajdowanie rozwiązań. Gwarantujemy, że po krótkim wyszukiwaniu, znajdziesz opis swojego problemu. Teraz czas na jego analizę.
Po trzecie, znajdź jego przyczynę
Na konsoli wypisane są też inne przydatne informacje, które przybliżą Cię do rozwiązania problemu — jak chociażby miejsce, w którym wyjątek się pojawił. Zazwyczaj IDE pozwala przejść bezpośrednio do problematycznej linijki w kodzie. Przejdź do niej i sprawdź w czym problem.
Po czwarte, zrozum swój błąd
Niektóre błędy np. literówki (które też Twoje IDE powinno podkreślić), brak @Autowired czy domyślnego konstruktora widać od razu, więc i poprawić można je natychmiastowo. Inne błędy wymagają dokładniejszej analizy. Wtedy warto skorzystać z debugowania, które opisaliśmy w lekcji Javy. W ten sposób, możemy dokładnie sprawdzić co linijka po linijce dzieje się w naszej aplikacji i naprawić problem.
Czasem, może okazać się, że nasz sposób napisania danej metody nie przynosi zakładanych przez nas rezultatów. Wtedy warto zapytać kogoś ze swojego zespołu, albo zadać pytanie na Stacku, poszukać naszego problemu w Internecie. Ktoś mi kiedyś powiedział, że jeśli w ciągu 15 min nie jesteś w stanie wygooglać odpowiedzi na swoje pytanie, to powinieneś zapytać kolegi z pracy :) Myślę, że coś w tej metodzie jest i większość programistycznych pytań została już zadana.
Zawsze: zapobiegaj, zamiast leczyć ;)
Co zrobić, by zminimalizować ilość walki z wyjątkami i naszymi błędami w programowaniu? Po pierwsze, dobrze rozumieć swój kod i to, co on robi. W tym celu polecamy Wam metodę gumowej kaczuszki, która naprawdę potrafi pomóc (nawet zaawansowanym programistom). Po drugie, polecamy też czytać “cudzy” kod (w szczególności na początku programowania), by poznać lepiej pewną logikę i koncepty, które są używane. A i warto też pisać testy, które pozwalają nam sprawdzać działanie naszego kodu — bo to, że “nic nie wyrzuci” przy uruchamianiu, nie znaczy wcale, że nasz kod działa poprawnie.
Tyle teorii, teraz czas na praktykę: poniżej mamy dla Was opis od diagnozy do rozwiązania problemu. Przejdźmy przez niego razem, by przekonać się, że nie jest to trudne.
Ćwiczenie
Na początku weźmy prosty przykład — NullPointerException w konsoli. Poniższy przykład jest może zbyt dużym uproszczeniem, ale jeśli Twój stack trace będzie dłuższy to sposó rozwiązywania pozostaje ten sam — szukamy ostatniego wyjątku (zaczynającego się od ‘Caused by…’ jeśli jest ich wiele) i patrzymy w jakiej klasie i w której linijce błąd się pojawia:
W tym wypadku chodzi o klasę KotyApplication, 8 linijkę. W Eclipse możemy kliknąć na tą nazwę — przeniesie nas to w odpowiednie miejsce.
Oczywiście błedem w tym wypadku jest to, że używamy metody toString() na polu kot, któremu nie nadaliśmy żadnej wartości (jest więc nullem) — stąd widoczny na konsoli NullPointerException.
W życiu niestety tak łatwo nie ma, a w aplikacjach webowych czy korzystając z frameworków, błąd może nie wskazywać nam konkretnej linii. Weźmy na przykład taki wyjątek:
Nie ma tutaj odniesienia do żadnej linijki w naszym kodzie. Wystarczy jednak wpisać w google treść wyjątku pomijając nazwy klas specyficznych dla naszego projektu — w tym wypadku szukamy “Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.kobietydokodu.web.controller.Kot] found for dependency” (niepogrubione fragmenty pomijamy). Pierwszy wynik w Google daje nam odpowiedź: “First off, you could be missing an annotation (@Service or @Component) from the implementation of” (za http://stackoverflow.com/a/8961439) — i faktycznie, w tym wypadku problemem było to, że nie mamy beana typu Kot (czyli np. w klasie Kot nie ma adnotacji @Component, możemy temu zaradzić dodając tą adnotację w tym miejscu)
Mamy nadzieję, że to podsumowanie dotyczące rozwiązywania problemów ułatwi Wam codzienną walkę z kodem. A jeśli jesteś dopiero na początku nauki, to zapewniamy, że do niekompilowania da się przyzwyczaić, a i wyjątki po jakimś czasie nie są tak straszne :)