Почему мое исключение EmptyStackException здесь не улавливается?

#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;
}