Co to jest NullPointerException i jak to naprawić?

Czym są wyjątki ze wskaźnikiem Null (java.lang.NullPointerException) i co je powoduje?

Jakich metod/narzędzi można użyć do określenia przyczyny, aby zapobiec przedwczesnemu zakończeniu wyjątku?

Author: Ziggy , 2008-10-20

12 answers

Kiedy deklarujesz zmienną referencyjną (np. obiekt), tworzysz wskaźnik do obiektu. Rozważ następujący kod, w którym deklarujesz zmienną typu prymitywnego int:

int x;
x = 10;

W tym przykładzie zmienna x jest int, a Java zainicjalizuje ją na 0. Po przypisaniu go do 10 w drugiej linii wartość 10 jest zapisywana do miejsca pamięci wskazywanego przez x.

Ale kiedy próbujesz zadeklarować typ odniesienia, dzieje się coś innego. Wpisz następujący kod:

Integer num;
num = new Integer(10);

Pierwsza linia deklaruje zmienną o nazwie num, ale nie zawiera prymitywnej wartości. Zamiast tego Zawiera wskaźnik (ponieważ typem jest Integer, który jest typem odniesienia). Ponieważ nie powiedziałeś jeszcze, co wskazywać na Javę ustawia ją na null, co oznacza " nie wskazuję na nic ".

W drugiej linijce słowo kluczowe new jest używane do tworzenia instancji (lub tworzenia) obiektu typu Integer, a zmienna wskaźnika num jest przypisana w następujący sposób obiekt. Można teraz odwoływać się do obiektu za pomocą operatora dereferencji . (kropka).

Exception o które pytałeś występuje, gdy zadeklarujesz zmienną, ale nie utworzyłeś obiektu. Jeśli spróbujesz dereferencji num przed utworzeniem obiektu otrzymasz NullPointerException. W najbardziej trywialnych przypadkach kompilator złapie problem i poinformuje cię, że "num nie zostało zainicjowane", ale czasami piszesz kod, który nie tworzy bezpośrednio obiektu.

Dla przykład, możesz mieć metodę w następujący sposób:

public void doSomething(SomeObject obj) {
   //do something to obj
}

W takim przypadku nie tworzysz obiektu obj, raczej zakładając, że został on utworzony przed wywołaniem metody doSomething. Niestety, możliwe jest wywołanie metody w ten sposób:

doSomething(null);

W którym to przypadku obj jest null. Jeśli metoda ma coś zrobić z przekazywanym obiektem, należy wyrzucić NullPointerException, ponieważ jest to błąd programisty i programista będzie potrzebował tej informacji do debugowania cele.

Alternatywnie, mogą być przypadki, w których celem metody nie jest wyłącznie działanie na przekazywanym obiekcie, a zatem dopuszczalny może być parametr null. W takim przypadku należy sprawdzić, czy nie ma parametru null i zachowywać się inaczej. Należy to również wyjaśnić w dokumentacji. Na przykład, doSomething można zapisać jako:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Wreszcie, Jak wskazać wyjątek i przyczynę za pomocą śledzenia stosu

 3287
Author: Vincent Ramdhanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-12 04:34:24

NullPointerExceptionS są wyjątkami, które występują, gdy próbujesz użyć odniesienia, które wskazuje na brak lokalizacji w pamięci (null), tak jakby odnosiło się do obiektu. Wywołanie metody na referencji null lub próba uzyskania dostępu do pola referencji null wywoła NullPointerException. Są to najczęstsze, ale inne sposoby są wymienione na NullPointerException strona javadoc.

Prawdopodobnie najszybszy przykładowy kod, jaki mogłem wymyślić, aby zilustrować NullPointerException, to:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

W pierwszej linii wewnątrz main jawnie ustawiam Object referencję obj równą null. Oznacza to, że mam odniesienie, ale nie wskazuje na żaden obiekt. Następnie staram się traktować odniesienie tak, jakby wskazywało na obiekt, wywołując na nim metodę. Powoduje to NullPointerException, ponieważ nie ma kodu do wykonania w miejscu, w którym wskazuje Referencja.

(jest to kwestia techniczna, ale myślę, że należy wspomnieć: odniesienie, które wskazuje na null, nie jest tym samym, co Wskaźnik C, który wskazuje na nieprawidłowe Miejsce Pamięci. Wskaźnik null dosłownie nie wskazuje w dowolnym miejscu , co subtelnie różni się od wskazywania miejsca, które wydaje się być nieprawidłowe.)

 777
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-25 14:24:54

Co to jest NullPointerException?

Dobrym miejscem na początek jest JavaDocs . Mają to pokryte:

Rzucony, gdy aplikacja próbuje użyć null W przypadku, gdy obiekt jest wymagany. Należą do nich:

  • wywołanie metody instancji obiektu null.
  • uzyskiwanie dostępu lub modyfikowanie pola obiektu null.
  • biorąc długość null tak, jakby była tablicą.
  • dostęp lub modyfikacja sloty null jakby to była tablica.
  • rzucanie null tak, jakby to była wartość do wyrzucenia.

Aplikacje powinny rzucać instancje tej klasy, aby wskazać inne nielegalne użycie obiektu null.

Jeśli spróbujesz użyć null reference z synchronized, to również wyrzuci ten wyjątek, na JLS:

SynchronizedStatement:
    synchronized ( Expression ) Block
  • W przeciwnym razie, jeśli wartość wyrażenia jest null, to rzuca się NullPointerException.

Jak to naprawić?

Więc masz NullPointerException. Jak to naprawić? Weźmy prosty przykład, który rzuca NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Identyfikacja wartości null

Pierwszym krokiem jest dokładne określenie które wartości powodują wyjątek . W tym celu musimy przeprowadzić debugowanie. Ważne jest, aby nauczyć się czytać stacktrace . To pokaże ci, gdzie został wyrzucony wyjątek:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Tutaj widzimy, że wyjątek jest wyrzucany w linii 13 (w metodzie printString). Spójrz na linię I sprawdź, które wartości są null przez dodawanie rejestrowanie instrukcji lub używanie debugera . Dowiadujemy się, że s jest null, a wywołanie na niej metody length rzuca wyjątek. Widzimy, że program przestaje rzucać wyjątek po usunięciu s.length() z metody.

Śledź skąd pochodzą te wartości

Następnie sprawdź skąd pochodzi ta wartość. Podążając za wywołujący metodę widzimy, że {[11] } jest przekazywana z printString(name) W metodzie print(), a this.name jest null.

Śledź, gdzie te wartości powinny być ustawione

Gdzie jest this.name ustawione? W metodzie setName(String). Przy dłuższym debugowaniu widzimy, że ta metoda w ogóle nie jest wywoływana. Jeśli metoda została wywołana, sprawdź kolejność , że te metody są wywoływane, a metoda set nie jest wywoływana po metodzie print.

To wystarczy aby dać nam rozwiązanie: dodaj wywołanie do printer.setName() przed wywołaniem printer.print().

Inne poprawki

Zmienna może mieć wartość domyślną (i setName może zapobiec ustawieniu jej NA null):

private String name = "";

Metoda print lub printString może sprawdzić, czy nie ma null , na przykład:

printString((name == null) ? "" : name);

Lub możesz zaprojektować klasę tak, aby name zawsze ma wartość inną niż null :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

Zobacz też:

Nadal nie mogę znaleźć problemu

Jeśli próbowałeś debugować problem i nadal nie masz rozwiązania, możesz wysłać pytanie o dalszą pomoc, ale upewnij się, że uwzględniłeś to, co próbowałeś do tej pory. Co najmniej, należy umieścić w pytaniu stacktrace, A zaznaczyć ważne numery linii w kodzie. Spróbuj najpierw uprościć kod (zobacz SSCCE ).

 627
Author: fgb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 13:53:51

Pytanie: co powoduje NullPointerException (NPE)?

Jak powinieneś wiedzieć, typy Javy są podzielone na typy prymitywne (boolean, int, itd.) i typy referencyjne . Typy referencji w Javie pozwalają na użycie specjalnej wartości null, która jest sposobem Javy na wyrażenie "no object".

A NullPointerException jest wyrzucany w czasie wykonywania, gdy twój program próbuje użyć null, tak jakby było to prawdziwe odniesienie. Na przykład, jeśli napiszesz to:

public class Test {
    public static void main(String[] args) {
        String foo = null;
        int length = foo.length();   // HERE
    }
}

Wypowiedź oznaczona "Tutaj" spróbuje uruchomić metodę length() na referencji null, a to rzuci NullPointerException.

Istnieje wiele sposobów na użycie null wartości, która spowoduje NullPointerException. W rzeczywistości, jedyne rzeczy, które możesz zrobić z null bez powodowania NPE, to: {[67]]}

    Przypisz go do zmiennej referencyjnej lub odczytaj ze zmiennej referencyjnej,
  • przypisanie go do elementu tablicy lub odczytanie go z elementu tablicy (pod warunkiem, że odniesienie do tablicy sama w sobie jest nie-null!),
  • podaj go jako parametr lub zwróć jako wynik, lub
  • przetestuj go za pomocą operatorów == lub !=, lub instanceof.

Pytanie: Jak odczytać NPE stacktrace?

Załóżmy, że kompiluję i uruchamiam powyższy program:

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:4)
$

Pierwsza uwaga: Kompilacja się powiodła! Problemem w programie nie jest błąd kompilacji. Jest to błąd runtime . (Niektóre IDE mogą ostrzegać, że twój program zawsze rzuci wyjątek ... ale standardowy kompilator javac nie.)

Druga obserwacja: kiedy uruchamiam program, wyświetla dwie linie "gobbledy-gook". Źle!!To nie jest gobbledy-gook. Jest to stacktrace ... i dostarcza istotnych informacji , które pomogą Ci wyśledzić błąd w kodzie, jeśli poświęcisz czas, aby go uważnie przeczytać.

Przyjrzyjmy się więc, co tam jest napisane:

Exception in thread "main" java.lang.NullPointerException

Pierwsza linia śledzenia stosu mówi o liczbie rzeczy:

  • mówi ci nazwę wątku Java, w którym został wyrzucony wyjątek. Dla prostego programu z jednym wątkiem (jak ten) będzie to "main". Chodźmy dalej ...
  • podaje pełną nazwę wyjątku, który został wyrzucony; tzn. java.lang.NullPointerException.
  • jeśli wyjątek zawiera powiązany komunikat o błędzie, będzie on wyświetlany po nazwie wyjątku. {[9] } jest niezwykły pod tym względem, ponieważ rzadko ma Komunikat o błędzie.

Druga linia jest najważniejszy w diagnozowaniu NPE.

at Test.main(Test.java:4)

To mówi nam wiele rzeczy:

  • "W teście.main " mówi, że byliśmy w main metodzie klasy Test.
  • "Test.java: 4 " podaje nazwę pliku źródłowego klasy i mówi nam, że instrukcja, w której to nastąpiło, znajduje się w linii 4 pliku.

Jeśli policzysz linie w powyższym pliku, linia 4 jest tą, którą oznaczyłem komentarzem "tutaj".

Zauważ, że w bardziej skomplikowany przykład, będzie wiele linii w śledzeniu stosu NPE. Ale możesz być pewien, że druga linia (pierwsza linia "at") powie Ci, gdzie NPE zostało rzucone1.

Krótko mówiąc ślad stosu powie nam jednoznacznie, które stwierdzenie programu wyrzuciło NPE.

1 - nie do końca prawda. Istnieją rzeczy zwane zagnieżdżonymi wyjątkami...

Pytanie: jak wyśledzić przyczynę wyjątku NPE w moim kod?

To jest najtrudniejsza część. Krótka odpowiedź polega na zastosowaniu wnioskowania logicznego do dowodów dostarczonych przez ślad stosu, kod źródłowy i odpowiednią dokumentację API.

Najpierw zilustrujmy prostym przykładem (powyżej). Zaczynamy od spojrzenia na linię, o której powiedział nam stack trace, gdzie doszło do NPE: {]}

int length = foo.length(); // HERE

Jak to może rzucić NPE?

W rzeczywistości jest tylko jeden sposób: może się zdarzyć tylko wtedy, gdy foo ma wartość null. My następnie spróbuj uruchomić metodę length() na null i .... BANG!

Ale co jeśli NPE zostanie wrzucone do wywołania metody length()?

Gdyby tak się stało, ślad stosu wyglądałby inaczej. Pierwsza linia " at " mówi, że wyjątek został wyrzucony w jakiejś linii w klasie java.lang.String, A linia 4 z Test.java będzie drugą linią "at". Więc skąd to się wzięło? W tym przypadku jest oczywiste, i jest oczywiste, co musimy zrobić, aby to naprawić. (Przypisanie wartości innej niż null do foo.)

OK, więc spróbujmy nieco bardziej skomplikowanego przykładu. Wymaga to pewnej dedukcji logicznej .

public class Test {

    private static String[] foo = new String[2];

    private static int test(String[] bar, int pos) {
        return bar[pos].length();
    }

    public static void main(String[] args) {
        int length = test(foo, 1);
    }
}

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.test(Test.java:6)
    at Test.main(Test.java:10)
$ 

Więc teraz mamy dwie linie "at". Pierwszy jest dla tej linii:

return args[pos].length();

A druga jest dla tej linii:

int length = test(foo, 1);

Patrząc na pierwszą linię, jak to może rzucić NPE? Istnieją dwa sposoby:

  • jeśli wartość bar wynosi null, to bar[pos] rzuci NPE.
  • jeśli wartość z bar[pos] jest null wtedy wywołanie length() na nim rzuci NPE.

Następnie musimy dowiedzieć się, który z tych scenariuszy wyjaśnia, co się naprawdę dzieje. Zaczniemy od odkrycia pierwszego z nich:

Skąd pochodzi bar? Jest to parametr wywołania metody test, a jeśli przyjrzymy się, jak została wywołana test, zobaczymy, że pochodzi ona ze statycznej zmiennej foo. Ponadto możemy wyraźnie zobaczyć, że zainicjalizowaliśmy foo do wartości innej niż null. To jest wystarczające, aby wstępnie odrzucić to Wyjaśnienie. (W teorii, coś innego może zmienić foo do null ... ale to nie dzieje się tutaj.)

Co z naszym drugim scenariuszem? Cóż, widzimy, że pos jest 1, więc to oznacza, że foo[1] musi być null. Czy to możliwe? W rzeczy samej! I w tym tkwi problem. Kiedy inicjalizujemy w ten sposób:
private static String[] foo = new String[2];

Przydzielamy String[] Z dwoma elementami , które są inicjowane do null. Po że nie zmieniliśmy treści foo... więc {[53] } nadal będzie null.

 448
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 14:05:30

To tak, jakbyś próbował uzyskać dostęp do obiektu, który jest null. Rozważ poniższy przykład:

TypeA objA;

W tej chwili właśniezadeklarowałeś Ten obiekt, ale niezainicjalizowałeś ani utworzyłeś instancję . I za każdym razem, gdy spróbujesz uzyskać dostęp do dowolnej właściwości lub metody, rzuci NullPointerException, co ma sens.

Zobacz także poniższy przykład:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
 374
Author: Rakesh Burbure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-15 14:58:39

Wyjątek wskaźnika null jest wyrzucany, gdy aplikacja próbuje użyć null W przypadku, gdy wymagany jest obiekt. Należą do nich:

  1. wywołanie metody instancji obiektu null.
  2. uzyskiwanie dostępu lub modyfikowanie pola obiektu null.
  3. biorąc Długość null jakby to była tablica.
  4. uzyskiwanie dostępu lub modyfikowanie slotów null tak, jakby to była tablica.
  5. rzucanie null jakby to była wartość do wyrzucenia.

Zastosowania należy rzucać instancje tej klasy, aby wskazać inne nielegalne użycie obiektu null.

Numer referencyjny: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

 322
Author: nathan1138,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 21:40:50

A NULL wskaźnik to taki, który wskazuje donikąd. Kiedy odbierasz wskaźnik p, mówisz " podaj mi dane w miejscu zapisanym w "p". Jeśli p jest wskaźnikiem null, lokalizacja przechowywana w p to nowhere, mówisz "podaj mi dane w lokalizacji 'nigdzie'". Oczywiście nie może tego zrobić, więc rzuca NULL pointer exception.

Ogólnie rzecz biorąc, dzieje się tak dlatego, że coś nie zostało prawidłowo zainicjowane.

 299
Author: MrZebra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-25 14:30:50

Istnieje już wiele wyjaśnień wyjaśniających, jak to się dzieje i jak to naprawić, ale powinieneś również przestrzegać najlepszych praktyk , aby w ogóle unikać NullPointerException.

[[9]}Zobacz: dobra lista najlepszych praktyk

Dodam, bardzo ważne, aby dobrze wykorzystać modyfikator final. używanie modyfikatora "final", gdy ma to zastosowanie w Javie

Podsumowanie:

  1. użyj modyfikatora final, aby wyegzekwować dobro inicjalizacja.
  2. unikaj zwracania null w metodach, na przykład zwracając puste zbiory, gdy ma to zastosowanie.
  3. użyj adnotacji @NotNull i @Nullable
  4. Fail fast and use asserts to avoid propagation of null objects through the whole application when they should be null.
  5. najpierw użyj równości ze znanym obiektem: if("knownObject".equals(unknownObject)
  6. Prefer valueOf() over ToString ().
  7. użyj metod null safe StringUtils StringUtils.isEmpty(null).
 285
Author: L. G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-25 14:31:46

Wyjątek wskaźnika null jest wskaźnikiem, że używasz obiektu bez inicjalizacji go.

Na przykład, poniżej znajduje się Klasa studencka, która użyje jej w naszym kodzie.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Poniższy kod daje wyjątek wskaźnika null.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Ponieważ używasz Obj_Student, ale zapomniałeś zainicjować to tak jak w poprawny kod pokazany poniżej:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
 283
Author: javid piprani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 21:44:41

W Javie wszystko ma formę klasy.

Jeśli chcesz użyć dowolnego obiektu, masz dwie fazy:

  1. Declare
  2. Inicjalizacja

Przykład:

  • Deklaracja: Object a;
  • Inicjalizacja: a=new Object();

To samo dla koncepcji tablicy

  • Deklaracja: Item i[]=new Item[5];
  • Inicjalizacja: i[0]=new Item();

Jeśli nie podajesz sekcji inicjalizacji, to NullpointerException powstają.

 275
Author: ashish bhatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 00:34:42

W Java wszystkie deklarowane zmienne są w rzeczywistości "odniesieniami" do obiektów (lub prymitywów), a nie same obiekty.

Gdy próbujesz wykonać jedną metodę obiektową, Referencja prosi żywy obiekt o wykonanie tej metody. Jeśli jednak Referencja odwołuje się do NULL (nothing, zero, void, nada), to nie ma możliwości wykonania metody. Następnie runtime poinformuje Cię o tym, rzucając wyjątek NullPointerException.

Twoje odniesienie to "wskazywanie" na null, czyli "null - > Pointer".

Obiekt żyje w przestrzeni pamięci maszyny wirtualnej i jedynym sposobem na uzyskanie do niego dostępu jest użycie referencji this. Weźmy ten przykład:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

I w innym miejscu w Twoim kodzie:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

To ważna rzecz, o której należy wiedzieć - gdy nie ma więcej odniesień do obiektu (w powyższym przykładzie, gdy reference i otherReference oba wskazują na null), to obiekt jest "nieosiągalny". Nie da się z nim pracować, więc Obiekt ten jest gotowy do odbioru śmieci, a na w pewnym momencie maszyna wirtualna zwolni pamięć używaną przez ten obiekt i przydzieli inną.

 265
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 07:52:57

Inne wystąpienie NullPointerException występuje, gdy deklaruje się tablicę obiektów, a następnie natychmiast próbuje dereferować elementy wewnątrz niej.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

tego konkretnego NPE można uniknąć, jeśli kolejność porównywania jest odwrócona; mianowicie, użyj .equals na gwarantowanym obiekcie non-null.

Wszystkie elementy wewnątrz tablicy są inicjalizowane do ich wspólnej wartości początkowej; dla dowolnego typu tablicy obiektowej oznacza to, że wszystkie elementy są null.

Ty musisz zainicjalizuj elementy w tablicy zanim uzyskają dostęp do nich lub zdereferują je.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}
 252
Author: Makoto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-25 14:35:15