Как обойти NullPointerException в Java? - PullRequest
0 голосов
/ 06 октября 2018

Итак, у меня есть текстовый файл, который содержит набор строк, которые я импортирую в программу, и моя программа ищет первый индекс первой повторяющейся строки:

static final int NOT_FOUND = -1;
dupeIndex = indexOfFirstDupe( wordList, wordCount );
    if ( dupeIndex == NOT_FOUND )
        System.out.format("No duplicate values found in wordList\n");
    else
        System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);

и методЯ использую, чтобы найти первый индекс дубликата следующим образом:

static int indexOfFirstDupe( String[] arr, int count )
{       

    Arrays.sort(arr);
    int size = arr.length;
    int index = NOT_FOUND;

    for (int x = 0; x < size; x++) {
        for (int y = x + 1; y < size; y++) {
            if (arr[x].equals(arr[y])) {
                index = x;
                break;
            }
        }
    }
    return index;

Проблема в том, что я получаю эту ошибку:

enter image description here

Это NullPointerException, и, насколько я понимаю, это означает, что в моем массиве строк (?) Есть практически нулевые значения.Есть ли какое-то простое решение этого, что я пропускаю?Возможно, переписать мой метод?

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Ошибка вызвана Array.sort (arr);

Согласно документу Java (https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-java.lang.Object%3aA-):

) Сортирует указанный массив объектов в порядке возрастания в соответствии с естественным порядком.его элементов. Все элементы в массиве должны реализовывать интерфейс Comparable .

Весьма вероятно, что исключение было выдано, когда сортировка пытается вызвать метод compareTo для нулевых объектовмассив String.

Итак, одно простое прямое решение - убедиться, что в вашем массиве String нет нулевых объектов ...

0 голосов
/ 06 октября 2018

Есть лучший способ сделать то, что вы хотите сделать.Это сложность O (n) против вашей - O (n ^ 2) + неудачная сортировка.

  public int indexOfFirstDup(String[] arr) {
    Set<String> valuesFound = new HashSet<>();
    for (int i=0;i<arr.length; i++) {
      String s = arr[i];
      // ignore nulls
      if (s == null) { continue; }
      if (valuesFound.contains(s)) {
        // here we identified a duplication and we can leave 
        return i;
      } else {
        valuesFound.add(s);
      }
    }
    // no dups
    return -1;
   }

ПРИМЕЧАНИЕ код не был скомпилирован и не протестирован - это просто идея!

0 голосов
/ 06 октября 2018

Предполагая, что вы правы в своем диагнозе

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

... Я могу придумать два обходных пути.

  1. Избавиться от ссылок null в массиве.Удалите их полностью или замените их (скажем) "" или "null" или чем-то еще безвредным.

  2. Существует перегрузка метода Arrays.sort, который принимает второй аргумент: a Comparator.Итак, что вы можете сделать, это реализовать Comparator, который может обрабатывать null, не бросая NPE.(Например, он может трактовать null как меньший, чем все ненулевые строки.)

Вот пример компаратора, который имеет дело с null:

    public class NullSafeStringComparator implements Comparator<String> {
        public int compare(String s1, String s2) {
            if (s1 == s2) {
                return 0;
            } else if (s1 == null) {
                return -1;
            } else if (s2 == null) {
                return 1;
            } else {
                return s1.compareTo(s2);
            }
        }
    }

В качестве альтернативы для Java 8 и более поздних версий вы можете создать его следующим образом:

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