Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中为pop()方法引发异常_Java_Exception_Stack - Fatal编程技术网

在Java中为pop()方法引发异常

在Java中为pop()方法引发异常,java,exception,stack,Java,Exception,Stack,对于我的一个类,我被指派创建自己的堆栈类,以及方法push()、pop()和size()。完整代码如下: public class Stack { private int maxStackSize, topOfStack; private int[] stack; public Stack(int maxStackSize) { if (maxStackSize <= 0) System.out.println(&

对于我的一个类,我被指派创建自己的堆栈类,以及方法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);
    }
}
但是,我仍然收到异常消息,但现在它只是伴随着我自己的消息,“无法弹出!堆栈为空”。我收到的完整异常如下:

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

如果可能,我不想显示异常,当遇到空堆栈时,只显示消息“Cannot pop!Stack is empty”。有办法做到这一点吗?我只是错误地抛出了异常吗?非常感谢您的帮助。

它显示了错误消息,因为您正在使用
抛出新的ArrayIndexOutOfBoundsException(“无法弹出!堆栈为空”)


如果您不希望出现错误,那么只需将消息打印到控制台而不打印它。

好消息:您没有抛出异常“错误”。问题在于调用
pop()
方法的代码如何处理(或不处理)异常。如果
pop()
抛出异常,该代码负责决定该做什么,并且取决于该代码是什么,您可能对该问题有发言权,也可能没有发言权

例如,如果讲师提供的某个自动测试或评估框架调用了
pop()
,而您无权访问该框架,那么无论该框架提供了什么异常处理行为,您都会陷入困境

但是,如果您编写了调用
pop()
的代码(或者至少可以访问该代码的源代码),那么您可以选择捕获异常并根据需要进行处理。例如,如果希望只显示错误消息而不显示完整堆栈跟踪,可以执行以下操作:

    try {
        pop();
    } catch (ArrayIndexOutOfBoundsException ex) {
        System.err.println(ex.getMessage());
    }
当然,不管您在这里读到什么,请确保您理解作业的要求,并严格遵循这些要求。

调用pop方法的要求
  • 即使堆栈为空,也可以调用
  • 不应该抛出异常
  • 方法签名可以更改
  • 可选择的方法
    import java.util.Optional;
    公共类堆栈测试{
    公共静态void main(字符串[]args){
    Stack Stack=newmysafeintegerstack(1);
    System.out.println(stack.push(1));
    System.out.println(stack.push(1));
    System.out.println(stack.pop().get());
    可选的popped=stack.pop();
    if(popped.isPresent()){
    System.out.println(popped.get());
    }否则{
    系统输出打印项次(弹出);
    }
    }
    接口栈{
    布尔推送(U值);
    V pop();
    }
    静态类MySafeIntegerStack实现堆栈{
    专用int maxStackSize、topOfStack;
    私有int[]堆栈;
    公共MySafeIntegerStack(最终整数maxStackSize){
    
    if(maxStackSize)如果我没有抛出错误,那么我会得到一个不同的错误,因为“if”中没有返回整数if-then语句的一部分。是否也有解决方法?您可以返回-1来指示错误,但我想问题是为什么您不希望出现错误。如果调用方试图从空堆栈中弹出,则抛出错误是有意义的。(顺便说一句,错误应该是EmptySackException,而不是ArrayOutOfBoundsException)。您的数据结构真的不应该关心错误在UI上的显示方式,这是UI的工作。让堆栈抛出它需要的任何内容,让UI决定向用户显示什么。我必须给您一个严肃的提示:在检查边界时,最好不要使用==,而是使用=,即“if(topOfStack)”
        try {
            pop();
        } catch (ArrayIndexOutOfBoundsException ex) {
            System.err.println(ex.getMessage());
        }