Używam eclipse i programowanie w języku Java. Czasami natrafiam na wyjątek nullPointerException, który będzie mnie nękał przez wiele godzin. Czy mimo to lepiej jest debugować argumenty nullPointerExceptions i dowiedzieć się, jakie są wartości zmiennych i inne rzeczy, które spowodowałyby zerowy wyjątek wskaźnika.Dobry sposób na debugowanie wyjątku nullPointerException
Odpowiedz
Obejrzyj ślad stosu i przeczytaj numer wiersza, w którym został zgłoszony NullPointerException
. Prawie zawsze, linia ma pewne metody wywołania takiego
x.getValue()
Jeśli x
jest null
, masz NullPointerException
. Jeśli metoda na początku śledzenia stosu nie jest twoim kodem, śledź cały stos, aż dotrzesz do kodu. Bardzo często w tym przypadku przechodzisz pod numer null
do metody, która nie odpowiada parametrom, które nie odpowiadają parametrom null
. Znajdź i napraw to.
Bardzo często, gdy napotkasz metodę, która nie jest twoja, która rzuca NullPointerException
, przeczytaj dokumentację. Na przykład, spójrz na String.replace(CharSequence target, CharSequence replacement)
:
Zgłasza:
NullPointerException
- jeślitarget
lubreplacement
jestnull
.
Nie robi się o wiele jaśniej niż to!
Oto przykład:
Patrząc na linii 4, widzimy foo.bar()
. Oznacza to, że foo
jest null
. Ta jest łatwa. Spójrzmy na inny przykład:
Kalka z powrotem do kodu, widzimy, że s.replace(target, replacement)
rzuca. Powinniśmy sprawdzić target
i replacement
. Załóżmy dołączyć debugger:
Aha! replacement
jest null
. Możesz zrobić to samo w Eclipse. Ustaw punkt przerwania dla wyjątku i użyj go do sprawdzenia parametrów do swojej metody. Jestem prymitywny tutaj, ponieważ pochodzę ze szkoły myśli, w której szczerze wierzę, że wszyscy będą lepsi, jeśli najpierw nauczyli się tego na własnej skórze. Przeciekające abstrakcje i tak dalej.
Przykład lub zrzut ekranu z kółkami odręcznymi byłby miły :) – hexafraction
Mój problem polega na tym, że przy funkcji podobnej do funkcji (a, b, c, d, e) nie wiadomo, która z tych zmiennych ma wartość null. –
@hexafraction: lub jeszcze lepiej, 8x10 w błyszczących obrazach z okręgami i strzałkami oraz akapit na odwrocie każdego z nich wyjaśniający, co każdy z nich miał być użyty. –
Istnieje kilka sposobów, aby NullPointerException
mniejszy problem:
Za pomocą @Nullable annotation.
Sprawdź wartości argumentów dla
null
w konstruktorach i ustawiaczach (unikaj ustawiania w zwykłym starym kodzie Java). Jeśli zrobisz to bardzo dużo, możesz stworzyć szablon kodu źródłowego (Eclipse), aby szybko wygenerować kod.Nazywa się to "failfast" - nie trzeba czekać na zgłoszenie wyjątku, gdy wartość jest używana dalej w kodzie, np. po przechowywaniu w polu.Upewnij się, że wykonujesz minimalną liczbę operacji (na przykład 1 lub 2) na linię. Jeśli nie, będziesz musiał dowiedzieć się, gdzie w wyrażeniu jednej linii wystąpił
NullPointerException
.Nie używaj
null
w polach, aby wskazać stan. Zamiast tego użyj np.enum State
. Na przykład. nie rób tak łatwoif (socket == null) { // not connected }
, aby później sprawdzić, czy nie jest tonull
. Wyraźny stan nie jest tak łatwy do zapomnienia.Nie zainicjuj zmiennych lokalnych na
null
, chyba że jest to wyraźnie potrzebne. Właściwie, jeśli prawidłowo obsługujecie swój zakres i wyjątki, powinniście być w stanie zaznaczyć większość zmiennychfinal
. Zastąpienie domyślnych metodprintStacktrace()
za pomocąthrow new IllegalStateException("Unhandled program state", e)
pomaga, ponieważ jest postrzegany jako punkt wyjścia bloku kodu.
Po wielu programach znajdziesz numer NullPointerException
s. W dół.
Podczas debugowania można użyć widoku
BreakPoints
, aby uchwycić zerowej wskazówek.Window -> Show View -> Wartości graniczne,
W widoku jest
"J!"
który pozwala ustawić punkty przerwania na wyjątkami. Możesz ustawićjava.lang.NullPointerException
. Tak więc po zgłoszeniu wyjątku wskaźnika null null można sprawdzić, która zmienna powoduje .Inną rzeczą, którą można zrobić, to przechwycić możliwy dostęp do wskaźnika zerowego podczas kodowania. Poza tym nie można przechwytywać wszystkich wskaźników Null, używając tego ustawienia. Ale nadal pomocne, ustaw następujące ustawienia w swoim zaćmieniu.
Preferencje -> Java -> Compiler -> Błędy/ostrzeżenia -> analiza Null
- 1. Debugowanie niezatapionego wyjątku w Xcode
- 2. Jak uzyskać szczegółowe informacje na temat wyjątku NullPointerException w JSP?
- 3. dlaczego null.asInstanceOf [Int] nie rzuca wyjątku NullPointerException?
- 4. Dlaczego nie powoduje to wyjątku NullPointerException?
- 5. Dobry sposób na uniknięcie "udostępniania"?
- 6. Wyjątek NullPointerException na java.awt.EventQueue.getCurrentEventImpl
- 7. Dobry sposób na łączenie React i ulotek
- 8. Scala: dobry sposób na utrzymanie par łańcuchów
- 9. jaki jest dobry sposób na połączenie zestawu?
- 10. Dobry sposób na wstępne ładowanie .NET assembly
- 11. Dlaczego Java ma wyjątek NullPointerException zamiast wyjątku NullReferenceException?
- 12. Błąd otwierania okna dialogowego przy użyciu wyjątku NullPointerException
- 13. Właściwy sposób na podniesienie wyjątku w python?
- 14. NullPointerException getSystemService
- 15. NullPointerException na zsynchronizowanym rachunku
- 16. Dobry sposób na użycie socket.io z klastrem na wielordzeniowym serwerze?
- 17. Dobry sposób na generowanie identyfikatorów GUID na silniku aplikacji?
- 18. Czy istnieje sposób na uruchomienie debuggera Ruby na wyjątku?
- 19. Visual Studio kończy debugowanie bez żadnego wyjątku lub błędu.
- 20. Zdalne debugowanie na serwerze
- 21. Brak wyjątku NullPointerException w JSTL podczas wywoływania metod na obiekcie pustym powiązanym z obiektem object.why?
- 22. TimePicker Wyjątek NullPointerException na ICS
- 23. Czy istnieje dobry sposób na wykonanie mavenify play! aplikacja ramowa?
- 24. dobry sposób na „wrap” słoiki dla OSGi z Maven
- 25. Dobry sposób na konwersję między krótkim i bajtów?
- 26. Jaki jest dobry sposób na * tymczasowe * sortowanie wektora?
- 27. JS dobry sposób na oznakowanie efekt z linii
- 28. Android: Czy istnieje dobry sposób na utworzenie okna dialogowego Toast?
- 29. Indeksowanie Neo4j (z Lucene) - dobry sposób na uporządkowanie "typów" węzłów?
- 30. Czy w trigger.io jest dobry sposób na obsługę OAuth?
spojrzeć na ślad stosu ... to pokazuje co linia rzucił NPE można umieścić przerwać tam i zobacz, która zmienna jest zerowa ... – chancea
Najlepszym sposobem, aby dowiedzieć się, jak debugować NPE jest ich debugowanie. Z czasem będzie ci lepiej. Ale kluczem jest dowiedzieć się, gdzie to się dzieje, a następnie sprawdzić zmienne. Bez magii tutaj. –
Możesz umieścić w kodzie polecenia 'assert' w swoim kodzie – MadProgrammer