Java 可以处理错误吗?

Java 可以处理错误吗?,java,Java,在此程序中,会发生StackOverflowerError,但会得到处理,并且程序不会异常终止。为什么? 您可以在中看到这一点,为什么您希望在捕获异常(或者更确切地说是本例中的错误)时它会终止?那个拦截器还能做什么 您可以捕获并处理几乎所有的错误条件,尽管通常您应该只捕获异常。您可以处理错误s,因为它们与异常一样是可丢弃的 错误被设计为指示程序无法控制的问题,如OutOfMemoryError和StackOverflowerError,但您也可以定义自己的错误 也许您认为或听说,OutOFMem

在此程序中,会发生StackOverflowerError,但会得到处理,并且程序不会异常终止。为什么?
您可以在

中看到这一点,为什么您希望在捕获异常(或者更确切地说是本例中的错误)时它会终止?那个拦截器还能做什么

您可以捕获并处理几乎所有的错误条件,尽管通常您应该只捕获异常。

您可以处理
错误
s,因为它们与
异常
一样是可丢弃的

错误被设计为指示程序无法控制的问题,如
OutOfMemoryError
StackOverflowerError
,但您也可以定义自己的错误

也许您认为或听说,
OutOFMemoryError
可以被捕获,但不能保证您有足够的空间来执行处理程序,因此错误通常不能被捕获。不过,就你而言,你侥幸逃脱了。捕获和处理此错误时未违反任何语言规则


真正的问题是,你应该抓住他们吗?通常,当抛出错误而不是异常时,您的应用程序很可能处于不一致的状态,这使得恢复充其量只能算是一个废话。所以要非常非常小心。最好忘记它,让应用程序死掉,因为在处理程序之后运行的任何东西都不能保证是您想要运行的东西。

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

通常您不会捕获
错误
,除了LinkageErrors、找不到类定义错误、未满足的链接错误、,不兼容的类更改错误


此外,outofmemory错误(有时是stackoverflow异常)也无法控制catch块,因为没有内存。

您可以捕获任何可丢弃的内容,由开发人员正确处理。您甚至可以处理ThreadDeath(由Thread.stop()触发)或Throwable的另一个子类(既不是错误也不是异常)


相关报道:我问这个问题是因为我听说错误是无法捕获/处理的。是否存在既不是错误也不是例外的可丢弃的示例?我添加了一个示例。嗯,这不是一个好的编程实践,因为它晦涩难懂,大多数人都不知道为什么不使用异常或错误我在想“野外的例子”。也许不会,因为这会让人皱眉。那么你确认一个
错误
会被发现吗?@Mohammad Faisal-他就是这么说的。这就是你的代码所做的。错误可以被捕获。。。但这样做通常不是个好主意。(就像用枪指着你的脚通常是个坏主意。)@Mohammad,是的,的确
Error
可以抓到物体。如果需要确认,请参阅。它在这个链接上说catch子句接受声明类型为
Throwable
Throwable
的任何子类的参数。请注意,
Error
Throwable
的一个子类。同样,这是可能的,但不是建议的。
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");
    }
}
public class MyThrowable extends Throwable { } // checked "exception"

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