Java 中的 pop() 方法抛出异常

Throwing exceptions for a pop() method in Java

对于我的 class 之一,我被分配创建自己的 Stack class,以及方法 push()、pop() 和 size()。完整代码在这里:

    public class Stack {

    private int maxStackSize, topOfStack;
    private int[] stack;

    public Stack(int maxStackSize) {
        if (maxStackSize <= 0)
            System.out.println("Stack size should be a positive integer.");
        else {
            this.maxStackSize = maxStackSize;
            topOfStack = -1;
            stack = new int[maxStackSize];
        }
    }

    public void push(int val) { 
        if(topOfStack == maxStackSize - 1)
            System.out.println("Cannot push! Stack is full.");
        else
            stack[++topOfStack] = val;
    }

    public int pop() { 
        if (topOfStack == -1)
            throw new ArrayIndexOutOfBoundsException("Cannot pop! Stack is empty.");
        else
        return stack[topOfStack--];
    }

    public int size() { 
        return (topOfStack+1);
    }
}

除了 pop() 的问题外,这些方法工作正常。我需要检查堆栈是否为空,即“if”语句,如果堆栈中没有任何内容,则显示错误信息“Cannot pop! Stack is empty”。但是,对于 if-else 的“if”部分,我没有 return 的整数,所以我一直在尝试抛出异常,正如您在我的尝试中看到的那样。

public int pop() { 
    if (topOfStack == -1)
        throw new ArrayIndexOutOfBoundsException("Cannot pop! Stack is empty.");
    else
    return stack[topOfStack--];
}

然而,我仍然收到异常消息,但现在它只是伴随着我自己的消息,“无法弹出!堆栈为空。”我得到的完整例外是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Cannot pop! Stack is empty.
    at Stack.pop(Stack.java:25)
    at Main.main(Main.java:6)

如果可以,我希望不显示异常,只在遇到空栈时显示“无法弹出!栈为空”。有没有办法做到这一点?我只是错误地抛出异常吗?感谢任何帮助。

显示错误消息是因为您抛出了错误 throw new ArrayIndexOutOfBoundsException("Cannot pop! Stack is empty.");

如果您不想出现错误,则只需将消息打印到控制台即可。

好消息:您没有“错误”地抛出异常。问题在于调用您的 pop() 方法的代码如何处理(或 处理)异常。该代码负责决定在 pop() 抛出异常时该怎么做,并且根据该代码的内容,您可能对此事有发言权,也可能没有发言权。

例如,如果 pop() 被您的讲师提供的某些您无权访问的自动化测试或评估框架调用,那么您将无法使用该框架提供的任何异常处理行为.

但是,如果 编写了(或至少可以访问其源代码)调用 pop() 的代码,您可以选择捕获异常并随心所欲地处理它。例如,如果您只想显示错误消息而不是完整的堆栈跟踪,您可以这样做:

    try {
        pop();
    } catch (ArrayIndexOutOfBoundsException ex) {
        System.err.println(ex.getMessage());
    }

当然,无论您在此处阅读任何其他内容,请务必了解您的作业要求并严格按照要求执行。

调用pop方法的要求

  1. 即使栈为空也可以调用
  2. 不应抛出异常
  3. 可以更改方法签名

可选方法

import java.util.Optional;

public class StackTest {

    public static void main(String[] args) {
        Stack<Integer, Optional<Integer>> stack = new MySafeIntegerStack(1);
        System.out.println(stack.push(1));
        System.out.println(stack.push(1));
        System.out.println(stack.pop().get());
        Optional<Integer> popped = stack.pop();
        if (popped.isPresent()) {
            System.out.println(popped.get());
        } else {
            System.out.println(popped);
        }
    }

    interface Stack<U, V> {

        boolean push(U value);

        V pop();
    }

    static class MySafeIntegerStack implements Stack<Integer, Optional<Integer>> {

        private int maxStackSize, topOfStack;
        private int[] stack;

        public MySafeIntegerStack(final int maxStackSize) {
            if (maxStackSize <= 0) {
                System.out.println("Stack size should be a positive integer.");
            } else {
                this.maxStackSize = maxStackSize;
                topOfStack = -1;
                stack = new int[maxStackSize];
            }
        }

        public boolean push(final Integer val) {
            if (topOfStack == maxStackSize - 1) {
                System.out.println("Cannot push! Stack is full.");
                return false;
            }
            stack[++topOfStack] = val;
            return true;
        }

        public Optional<Integer> pop() {
            if (topOfStack == -1) {
                System.out.println("Cannot pop! Stack is empty.");
                return Optional.empty();
            } else {
                return Optional.of(stack[topOfStack--]);
            }
        }

        public int size() {
            return (topOfStack + 1);
        }
    }
}

备注

  • 假设堆栈必须使用数组(而不是列表)来实现,泛型类型无法进一步抽象。 (泛型类型无法创建数组)
  • 可以添加另一个实现以在无效 pop()push() 调用时抛出异常