указатель нулевого массива Java

#java #arrays #nullpointerexception

#java #массивы #исключение nullpointerexception

Вопрос:

Я пытаюсь найти минимум массива. Массив содержит узлы — узел содержит элемент E и значение приоритета int. Я хочу найти узел в массиве с наименьшим приоритетом.

 @Override
public E min() {
    Node temp = S[0];
    for(int i = 1; i<S.length; i  ){
        int prio= S[i].getPrioritet();   <-- nullpointer excp.
        if(prio<temp.getPrioritet()){
            temp = S[i];
        }
    }
    return temp.getElement();
  

Но я получаю исключение nullpointer, когда пытаюсь его использовать. Кто-нибудь знает, что я делаю не так?

Вот мой тест:

 PrioritetArraySorteret<String> p = new PrioritetArraySorteret<String>();

    p.insert(1, "Hello");
    p.insert(3, "Hi");
    p.insert(4, "Hawdy");
    System.out.println(p.min());

}
  

Комментарии:

1. для(int i = 1; i<S.длина; i ) —> i начинается с 1? Сколько составляет S.length? В этом случае кажется, что S [i] равно нулю….

Ответ №1:

начните с i= 0, поскольку массив индексируется

 for(int i = 0; i<S.length; i  ){
    int prio= S[i].getPrioritet();   <-- nullpointer excp.
    if(prio<temp.getPrioritet()){
        temp = S[i];
    }
}
  

Комментарии:

1. Нет, потому что я сравниваю другие элементы в массиве с первым элементом в массиве -> Node temp = S[0];

2. На самом деле это не решает проблему, и индекс должен был начинаться с 1, чтобы начать сравнение со второго элемента, поскольку первый использовался в качестве основы для минимума.

3. верно, но это не повлияет на результат и является простым решением того, что делать, когда в массиве есть только один элемент

Ответ №2:

Это просто означает, что элемент в одном из индексов массива S равен null. Возможно, вы инициализировали массив с размером, n но заполнили меньше n позиций.

Подобное изменение, вероятно, исправит это:

 for(int i = 1; i<S.length; i  ){
    if(S[i] != null) {
        int prio= S[i].getPrioritet();   <-- nullpointer excp.
        if(prio<temp.getPrioritet()){
            temp = S[i];
        }
     }
}
  

Тем не менее, вы, возможно, немного изобретаете колесо. Достаточно использовать простой ArrayList параметр с некоторым типом, который вы определяете, который инкапсулирует значение и приоритет. Затем вы могли бы реализовать этот тип Comparable с compareTo помощью метода, который использует приоритет, или написать Comparator для поиска минимального:

 List<YourType<String>> list = new ArrayList<YourType<String>>();
Collections.min(list);
  

Или, если вы используете пользовательский компаратор:

 Collections.min(list, yourComparator);
  

— отредактировано для min вместо sort . Извините.

Ответ №3:

Массив S не был инициализирован или один / более элементов были инициализированы.