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

问题描述

对于我的一个类,我被指派创建自己的 Stack 类,以及 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”语句,如果堆栈中没有任何内容,则显示错误消息“无法弹出!堆栈为空”。但是,我没有为 if-else 的“if”部分返回一个整数,所以我一直在尝试抛出异常,正如您所看到的那样。

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() 调用无效,可以添加另一个实现以抛出异常