Java: проверка, является ли Comparable не нулевым, возвращает NullPointerException - PullRequest
0 голосов
/ 05 июня 2011

У меня большая проблема с этим кодом, и я не знаю, как его вызвать:

while(tree.find(indexreg)!=null){
        //do stuff
    }

По какой-то причине сравнение tree.find (indexreg) со значением null вызывает исключение NullPointerException. Поскольку это проект колледжа, я должен использовать собственную реализацию бинарного дерева вместо той, что предусмотрена Java. tree - это BinarySearchTree, а indexreg - сопоставимый объект, который уже был инициализирован. Это код для поиска в классе BinarySearchTree:

public Comparable find(Comparable x) {
        return elementAt(find(x, root));
    }

Он ищет объект в дереве и возвращает ноль, если не находит его (я не думаю, что вы можете вернуть пустой сопоставимый объект). Я попробовал поискать в Google, но не нашел полезного ответа. Кто-нибудь знает, как заставить этот код работать?

Ответы [ 3 ]

2 голосов
/ 05 июня 2011

Я не думаю, что проблема связана с вашим Comparable.

Если строка while(tree.find(indexreg) != null) { выдает NullPointerException, должно быть , потому что tree это null.Другие возможности не заслуживают доверия.

  • Сравнение ссылки на объект с null с использованием == или != НЕ БУДЕТ бросить NPE.Таким образом, даже если tree.find(...) вернул null, это не может быть причиной этого исключения.

  • Передача значения null в качестве аргумента метода НЕ БУДЕТ бросить NPE,Так что, если indexreg было null, это не вызвало бы это исключение.(NPE может быть сгенерирован методом find или чем-то, что он вызывает, но трассировка стека не будет показывать другую строку в другом методе в качестве источника исключения.)


(Я мог неправильно истолковать вопрос. Я предполагаю, что OP означает «броски», когда он говорит, что строка «вызывает» исключение.

К сожалению, OPтолько публикует фрагменты кода и не показывает нам трассировку стека ... что является важным доказательством.)

2 голосов
/ 05 июня 2011
public Comparable find(Comparable x) {
    return x == null ? null : elementAt(find(x, root));
}

к вашему сведению это эквивалентно:

public Comparable find(Comparable x) {
    if (x == null) return null;
    return elementAt(find(x, root));
}

Вы также можете улучшить ясность своего кода: у вас есть вызов метода и тест, объединенные. Хотя само по себе это не «плохо», ИМХО было бы чётче разделить два, И получить значение, возвращаемое в случае, если вы хотите что-то с ним сделать, например:

for (Comparable<?> result = tree.find(indexreg); result != null; result = tree.find(indexreg)) {
    //do stuff with variable "result"
}

Это просто делает более очевидным, что контролирует цикл.

Есть другой способ получить результат, но он считается "плохим стилем кодирования"; то есть назначить и проверить в одном:

Comparable<?> result;
while ((result = tree.find(indexreg)) != null) {
    //do stuff with variable "result"
}

Некоторые считают, что вам следует избегать такого стиля кодирования. Я склонен с ними согласиться.

0 голосов
/ 05 июня 2011

Возможно indexreg нулевой, не инициализирован вообще. Вы, конечно, должны использовать код find () более защищенно, как это предлагает @Bohemian, но это может быть основной проблемой. Или см. Следующий комментарий ниже.

...