Как я могу ссылаться на объект ТОЛЬКО если он действительно существует? - PullRequest
0 голосов
/ 11 ноября 2019

Я реализую стек, используя связанный список в Java. Проблема в том, что я получаю исключение nullPointerException, когда ниже нет элемента, например, StackNode.link не существует. Поэтому, если я пытаюсь назначить StackNode.link, я получаю исключение.

Используя оператор if для запуска кода, только если он существует, я просто получаю Исключение в операторе if. Как мне поступить об этом?

int pop() {

    StackNode temp = top;

    // update top
    top = belowTop;
    belowTop = top.link; // this is where I get the nullPointExcpetion


    return temp.data;

}

Я ожидаю, что если top.link не существует (например, имеет значение null), то underTop будет просто нулевым. Это было бы хорошо, но, как описано, я получаю исключение.

РЕДАКТИРОВАТЬ: Это то, что я пытался с оператором if

if (top.link != null) {
        belowTop = top.link;
    }
else {
        belowTop = null;
    }

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Вам необходимо проверить, инициализирована ли переменная top или нет:

...
if (top != null) {
   belowTop = top.link;
} else {
   // Handle the not initialized top variable
}
...

Вероятно, хорошим решением является создание исключения времени выполнения, если belowTop, если не инициализировано, например

...
if (top == null) {
   throw new IllegalStateException("Can't pop from an empty stack");
} 
belowTop = top.link;
...

В этом случае вам также необходимо подготовить метод, который дает возможность проверить, не является ли стек пустым или не инициализирован. Вот полное предложение:

public boolean isEmpty() {
   // Your logic here 
}

// Better have a public access because it seems an utility library and 
// it should be accessed from anywhere
public int pop() {

    StackNode temp = top;

    // update top
    top = belowTop;
    if (top == null) {
        throw new IllegalStateException("Can't pop from an empty stack");
    } 
    belowTop = top.link; // Now it works

    return temp.data;

}

И вы можете использовать его следующим образом:

if (!myStack.isEmpty()) {
   int value = myStack.pop();
   // Do something
}
0 голосов
/ 11 ноября 2019

Дайте этому шанс:

if (top.link != null) {
    belowTop = top.link;
} else {
    //handle the exception
}

Вышеприведенная проверка проверяет, является ли top.link нулевым, что является действительной проверкой и не вызовет исключение nullPointerException.

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