2015-04-27 5 views
1

Я создал метод поиска для связанного списка. Он работает правильно, когда я ищу что-то, что существует в списке. Если я ищу что-то не в списке, тогда я получаю исключение с нулевым указателем.null Указатель исключения при поиске связанного списка

Я не вижу, как можно получить это исключение.

Вот метод:

// these two search methods return the node containing the substring given 
public UNode search(String cityName) 
{ 
    return search(cityName,this);//line 90 
}//end search()------------------------------------------------------------- 
private UNode search(String cityName, UNode current) 
{ 
    if(current != null) 
    { 
     if (current.getCity().getName().contains(cityName)) 
     { 
      System.out.println("Node '" + current.getCity().getName() 
        + "' has been found and returned."); 
      return current; 
     } else 
     { 

      return search(cityName,current.next);//line 105 
     } 
    } 
    else 
    { 
     System.out.println("No node containing the substring '" 
       + cityName + "' can be found, returning null"); 
     return null; 
    } 
}//end search()------------------------------------------------------------- 

В моем понимании, это то, что происходит при поиске чего-то, что не существует: метод продолжает называть поиска() рекурсивно с current.next, он попадает в последний элемент и вызывает поиск (cityName, null), тогда, поскольку текущий имеет значение null, он говорит, что он не найден и возвращает null.

Я что-то упустил? Что я делаю не так? Должен ли я просто выбросить исключение нулевого указателя?

Вот метод, где я вызываю метод поиска:

public static void uNodeTest(City[] cities) 
{ 


    UNode unvisited = new UNode(); 

    unvisited.addCities(cities); 


    String a = unvisited.getNext().getNext().getNext().getCity().getName(); 

    System.out.println(a); 

    UNode current = unvisited; 
    while(current.getNext() != null) 
    { 
     System.out.println(current.getCity().getName()); 
     current = current.getNext(); 
    } 
    UNode phil = unvisited.search("not a city"); 
} 

трассировки стека:

java.lang.NullPointerException 
at cityproject.UNode.search(UNode.java:105) 
. 
. 
. 
at cityproject.UNode.search(UNode.java:105)//(omitting repeats) 
at cityproject.UNode.search(UNode.java:90) 
at cityproject.CityProject.uNodeTest(CityProject.java:104) 
at cityproject.CityProject.main(CityProject.java:79) 
+1

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

+0

Ну, я в настоящее время возвращаю null, но вместо того, чтобы возвращать null, он сбой и дает мне исключение null-указателя. – user2809114

+0

Можете ли вы также отправить свой запрос на поиск и отслеживать трассировку стека. Я пока не вижу проблемы. –

ответ

0

Я хотел бы добавить проверку перед вызовом рекурсивный поиск, чтобы увидеть, если current.next является недействительным :

if(current.next != null) { 
    return search(cityName,current.next); 
} 
else { 
    return null; 
} 

Это может решить исключения нулевого указателя ...

Смежные вопросы