не может объяснить NullPointerException - PullRequest
3 голосов
/ 24 марта 2010

В следующем коде у меня есть метод, чтобы получить Vector людей с одинаковым знаком зодиака. persoane - это Vector<Persoana>. Я продолжаю получать NullPointerException при условии if (persoane определенно не равно нулю). Я не могу понять, почему. Любая помощь будет принята с благодарностью

public Vector<Persoana> cautaDupaZodie(String zodie)
{
    Vector<Persoana> rezultat= new Vector<Persoana>();

    for(int i=0; i<persoane.size(); i++)
    {
        if(persoane.get(i).getData().getZodie().equals(zodie)) //the exception occurs here
        {
            rezultat.add(persoane.get(i));
        }

    }

    return rezultat;
}

Ответы [ 7 ]

5 голосов
/ 24 марта 2010

NullPointerException происходит, когда вы пытаетесь вызвать метод для Object, то есть null.

Это означает, что одно из следующих значений возвращает null:

  • get(i)
  • getData()
  • getZodie()

Добавьте их по одному, чтобы узнать, что на самом деле является причиной вашего исключения.

2 голосов
/ 24 марта 2010
persoane.get(i).getData().getZodie()

разбейте это на несколько строк, чтобы увидеть, где находится NPE.

Также рассмотрите возможность использования цикла for-each.

for (Persoana persoana: rezultat){
    ...
}
1 голос
/ 24 марта 2010
if(persoane.get(i).getData().getZodie().equals(zodie))

разбить вышеуказанную строку на несколько частей. Здесь getData должен возвращать нуль, поэтому вы получаете NullPointerException

1 голос
/ 24 марта 2010

Прежде всего, вы должны использовать List<Person>, если это возможно. Затем я рекомендую разбить цепочку методов на более мелкие шаги, чтобы увидеть, какой именно шаг не выполняется.

public List<Person> searchZodiac(String zodiac) {
    assert zodiac != null; // if it fails here, zodiac == null

    List<Person> result = new ArrayList<Person>();

    for (Person p : persons) {
        Data d = p.getData();      // if it fails here, p == null
        String z = d.getZodiac();  // if it fails here, d == null
        if (z.equals(zodiac)) {    // if it fails here, z == null
           result.add(p);
        }
    }

    return result;
}
1 голос
/ 24 марта 2010

Это может быть любое из следующего:

  • persoane содержит null по любому индексу
  • Любой из элементов persoane возвращает null для getData()
  • Любой из getData() повторных результатов null для getZodie()

Чтобы продолжить исследование, лучше разбить эту цепочку методов и добавить условную точку останова. Кроме того, переосмыслите свой дизайн - этот вид «метода, работающего с глубоко вложенной структурой данных без поведения» плох по этой и другим причинам.

1 голос
/ 24 марта 2010

Вы можете добавить некоторый код «трассировки»:

public Vector<Persoana> cautaDupaZodie(String zodie)
{
    Vector<Persoana> rezultat= new Vector<Persoana>();

    for(int i=0; i<persoane.size(); i++)
    {
        System.err.println(persoane.get(i));
        System.err.println(persoane.get(i).getData());
        System.err.println(persoane.get(i).getData().getZodie());
        if(persoane.get(i).getData().getZodie().equals(zodie)) //the exception occurs here
        {
            rezultat.add(persoane.get(i));
        }

    }

    return rezultat;
}
1 голос
/ 24 марта 2010

getData() или getZodie() возвращает null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...