我正在使用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)
因此我认为我的异常被捕获,因为它打印“无效操作...”,但我的程序也会在抛出异常时终止。有什么帮助吗?
答案 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;
}