public class StackTest {
public static void main(String[] args) {
show();
System.out.print("welcome back to maain");
display();
}
static void show(){
try{
show(); //recursion
}catch(StackOverflowError e){
System.out.print("error cought");
}
}
static void display(){
System.out.print("after stack overflow error");
}
}
在此程序中发生StackOverflowError但会被处理并且程序不会异常终止。为什么? 您可以在http://ideone.com/vwSav
看到这一点答案 0 :(得分:5)
你可以处理Error
,因为它们Throwable
就像Exception
一样。
错误旨在表明程序无法控制的问题,例如OutOfMemoryError
和StackOverflowError
,但您也可以定义自己的错误。
也许你正在考虑,或者听说,OutOFMemoryError
可以被抓住但是不能保证你有足够的空间来执行处理程序,因此错误通常不是你可以捕获的东西。但是,在你的情况下,你逃脱了它。在捕获和处理此错误时没有违反任何语言规则。
真正的问题是,你应该抓住它们吗?通常,当抛出错误(而不是异常)时,您的应用程序很可能处于不一致状态,从而使恢复成为最佳状态。所以真的,非常小心。最好忘记它,然后让应用程序死掉,因为无法保证在处理程序之后运行的任何东西都是你想要运行的东西。
答案 1 :(得分:2)
为什么在捕获异常(或者更确切地说是这种情况下的错误)时会期望它终止?那个catch块还能做什么呢?
您可以捕获并处理几乎所有错误情况,但通常您应该只捕获异常。
答案 2 :(得分:1)
你可以捕获任何Throwable,由开发人员来正确处理它。你甚至可以处理ThreadDeath(由Thread.stop()触发)或另一个Throwable子类(既不是错误也不是异常)
public class MyThrowable extends Throwable { } // checked "exception"
try {
throw new MyThrowable();
} catch (Throwable t) {
t.printStackTrace();
Thread.currentThread().stop(t); // rethrow blindly.
}
答案 3 :(得分:0)
如果您的异常一直传播到main方法并且您没有在那里处理它,它将只会异常终止。通常发生在未经检查的运行时异常中。如果要终止程序并关闭VM,可以在catch块中调用System.exit(int errorCode),那么程序员总会在这里抱怨如果已经完成但是这是一种方法。
答案 4 :(得分:0)
通常你不会捕获Error
,除了LinkageErrors,没有类def发现错误,链接错误不满意,类更改错误不兼容..
也是一个outofmemory错误(有时stackoverflow异常)不会控制catch块,因为没有内存。