2013-07-26 16 views
16

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

+2

spojrzeć na ślad stosu ... to pokazuje co linia rzucił NPE można umieścić przerwać tam i zobacz, która zmienna jest zerowa ... – chancea

+0

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. –

+1

Możesz umieścić w kodzie polecenia 'assert' w swoim kodzie – MadProgrammer

Odpowiedz

22

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śli target lub replacement jest null.

Nie robi się o wiele jaśniej niż to!

Oto przykład:

enter image description here

Patrząc na linii 4, widzimy foo.bar(). Oznacza to, że foo jest null. Ta jest łatwa. Spójrzmy na inny przykład:

enter image description here

Kalka z powrotem do kodu, widzimy, że s.replace(target, replacement) rzuca. Powinniśmy sprawdzić target i replacement. Załóżmy dołączyć debugger:

enter image description here

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.

+2

Przykład lub zrzut ekranu z kółkami odręcznymi byłby miły :) – hexafraction

+1

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. –

+2

@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. –

4

Istnieje kilka sposobów, aby NullPointerException mniejszy problem:

  1. Za pomocą @Nullable annotation.

  2. 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.

  3. 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.

  4. Nie używaj null w polach, aby wskazać stan. Zamiast tego użyj np. enum State. Na przykład. nie rób tak łatwo if (socket == null) { // not connected }, aby później sprawdzić, czy nie jest to null. Wyraźny stan nie jest tak łatwy do zapomnienia.

  5. 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ść zmiennych final. Zastąpienie domyślnych metod printStacktrace() 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ół.

17
  1. 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 .

  2. 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

Powiązane problemy