Try-Catch块终止

时间:2015-01-22 22:12:28

标签: java exception try-catch

我正在使用try-catch块来捕获在堆栈上运行某些方法时可能抛出的任何异常。我的pop方法代码如下所示:

public T pop()
{   
    T temp = null;
    try
    {
        temp = first.data;

    }
    catch(Exception e)
    {
         System.out.println("Invalid operation on an empty stack");

    }
    first = first.next;
    return temp;
}

当我运行程序时,异常被捕获...我的终端产生了这个: (菜单选项'd'是pop方法)

  

请输入菜单选项:d

     

空堆栈上的操作无效   线程“main”java.lang.NullPointerException中的异常           在MyStack.pop(MyStack.java:58)           在StackTest.main(StackTest.java:52)

因此我认为我的异常被捕获,因为它打印“无效操作...”,但我的程序也会在抛出异常时终止。有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

我们今天学到了非常宝贵的一课:没有充分的理由不抓住Exception

这里的问题是first会回来null,所以一旦我们尝试取消引用它,我们就会抛出该异常。

让我们从不同的角度来看待它。如果first为空,我们知道我们无法弹出任何内容,因此我们应该抛出异常。

public T pop() {
    if(first == null) {
        throw new EmptyStackException("Invalid operation on empty stack");
    }

    T value = first.data;
    first = first.next;
    return value;
}

答案 1 :(得分:1)

似乎还有另外一个异常被抛出,你的catch块之后。 first很可能为空。这会导致执行catch块(因为first.data是一个空指针异常),但它也会导致另一个空指针异常

first = first.next;

因此你有一个未被捕获的例外。你如何解决这个问题取决于你;它更像是一个设计决策,而不是一个正确的设计决策。

最简单且可能正确的选择是在try块中进行所有修改,所以如果出现问题,你就不会恢复可能无法正常工作的操作。

public T pop(){   
    T temp = null;
    try{
        temp = first.data;
        first = first.next;
    }
    catch(Exception e){
         System.out.println("Invalid operation on an empty stack");
    }
    return temp;
}

当然,try..catch构造在这里并不合适。编写相同方法的更为简洁的方法是:

public T pop(){   
    if(first == null) return null;

    //By virtue of reaching this point, first is necessarily non-null.
    T temp = first.data;
    first = first.next;
    return temp;
}

但如果目标是试验try..catch,请使用我的最佳答案。

答案 2 :(得分:1)

根据您的输出,

first显然是null。现在,您正在捕获NullPointerException产生的temp = first.data,而不是first = first.next产生的try(因为该分配未附加public T pop() { T temp = null; try { temp = first.data; // <-- you catch the exception thrown here } catch(Exception e) { System.out.println("Invalid operation on an empty stack"); } first = first.next; // <-- but you don't catch the one thrown here return temp; } 块):

NullPointerException

一般情况下,抓住null 的主意很糟糕。事先明确检查{{1}}。

答案 3 :(得分:0)

你的第一个很可能是空的。

尝试使用此代码

public T pop()
{   
    T temp = null;
    try 
    {
        if (first != null) 
        {
            temp = first.data;
            first = first.next;
        }
    }
    catch(Exception e)
    {
         System.out.println("Invalid operation on an empty stack");

    }
    return temp;
}