2011-08-30 73 views
0
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是否可以处理错误?

+1

(通过使用Thread.stop()触发):http://stackoverflow.com/questions/ 2535723/try-catch-on-stack-overflows-in-java – Thilo

回答

5

可以处理Error因为他们是Throwable就像Exception s。

错误旨在指示程序控制之外的问题,如OutOfMemoryErrorStackOverflowError,但您也可以定义自己的错误。

也许你正在想,或听说OutOFMemoryError可以被捕获,但不能保证你有足够的空间来执行处理程序,所以一般来说错误不是你可以捕捉到的。但就你而言,你逃避了。在捕捉和处理这个错误时没有违反语言规则。

真正的问题是,应该你抓住他们?通常,当发生错误而不是异常时,您的应用程序很可能处于不一致的状态,从而使恢复成为最佳状态。所以真的很小心。最好不要忘记它,让应用程序死掉,因为在处理程序不能保证是你想运行的东西之后运行的任何东西。

+0

所以你确认'Error'可以被捕获? –

+0

@穆罕默德费萨尔 - 他就是这么说的。这就是你的代码所做的。错误可以被捕获......但这通常是一个糟糕的想法。 (就像在你的脚上放枪一样,通常是一个糟糕的主意。) –

+0

@Mohammad,的确,可以捕获错误对象。如果您需要确认,请参阅[Java语言规范中有关try语句的部分](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20)。它在这个链接上说,catch子句使用声明类型为“Throwable”或“Throwable”的任何子类的参数。请注意,'Error'是'Throwable'的子类。再次,可能但不建议。 –

2

看到这个为什么当你捕捉到异常(或者在这种情况下是错误)时你会期望它终止?该catch块还能做什么?

你可以捕获和处理几乎所有的错误条件,但通常你应该只捕获异常。

+0

我在问这个,因为我听说错误无法被捕获/处理 –

+0

对此,请参阅@ Ray的答案。 – Thilo

0

如果您的异常一直传播到您的主要方法并且您没有在那里处理它,它将只会异常终止。通常会发生未经检查的运行时异常。如果你想终止你的程序并关闭虚拟机,你可以在catch块中调用System.exit(int errorCode),如果这样做的话,会有程序员总是抱怨,但这是一种方法。

0

通常你不抓Error,除了LinkageErrors,无级高清发现错误,不合适的链接错误,不兼容的类变化错误..

也是一个OutOfMemory错误(有时计算器除外)不列入给予控制因为没有内存,所以catch块。

1

您可以捕获任何Throwable,并由开发人员正确处理。你甚至可以处理的ThreadDeath或其他子类Throwable(这既不是一个错误或异常)相关

public class MyThrowable extends Throwable { } // checked "exception" 

try { 
    throw new MyThrowable(); 
} catch (Throwable t) { 
    t.printStackTrace(); 
    Thread.currentThread().stop(t); // rethrow blindly. 
} 
+0

有没有既不是错误也不是异常的Throwables的例子? – Thilo

+0

我已经添加了一个例子。恕我直言,它不是很好的编程实践,因为它的晦涩和大多数人不知道你为什么不使用异常或错误。 ;) –

+1

我在想“野外的例子”。可能不会,因为它会被折磨。 – Thilo