#java #linked-list #nullpointerexception #stack
#java #связанный список #исключение nullpointerexception #стек
Вопрос:
Я тестирую эту реализацию стека (со связанным списком) У меня есть, и пока у меня не возникает никаких проблем с нажатием, появлением и просмотром, пока стек не пуст.
Однако, когда я пытаюсь запустить этот код с блоком try catch для исключения EmptyStackException с пустым массивом, он не улавливается.
Когда я запускаю это:
public class Run {
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
//test empty stack
if(stack.isEmpty())
System.out.println("1");
try {
stack.pop();
} catch (EmptyStackException e) {
System.out.println("2");
}
}
}
Печатается «1», а затем возникает исключение NullPointerException.
Вот часть моего кода, которая заботится о том, чтобы извлекать элементы из стека:
public Item pop() throws EmptyStackException{
s--;
Item prevFirst = first.item;
first = first.next;
return firstVal;
}
Я что-то здесь делаю не так?
Ответ №1:
Нигде в pop()
методе он фактически не выдает EmptyStackException
, когда стек пуст.
Комментарии:
1. Итак, как именно я мог бы это добавить? Извините, я не очень знаком с выполнением этого на Java. Я просто предположил, что добавление его в начало кода сработает.
2. Добавление
throws EmptyStackException
в сигнатуру метода просто сообщает компилятору, что метод может вызвать это исключение. В самом методе вам все равно нужноthrow new EmptyStackException()
в какой-то момент, если стек пуст.
Ответ №2:
Однако, когда я пытаюсь запустить этот код с блоком try catch для исключения EmptyStackException с пустым массивом, он не улавливается.
Потому что pop()
ничего не выдает. в вашем pop()
методе вы должны проверить размер стека, и если он был пуст, то вы можете создать исключение (EmptyStackException) и выбросить его.
итак, ваш код должен быть примерно таким:
public Item pop()throws EmptyStackException{
// Check if the stack is empty or not
if (s == 0){
throw new EmptyStackException();
}
s--;
Item prevFirst = first.item;
first = first.next;
return firstVal;
}