java - 如果我发现错误会发生什么?

标签 java error-handling

令人惊讶的是google didn't describe any catastrophic scenarios我扭曲的头脑渴望。

在我阅读的任何地方,都不鼓励捕获错误。基本规则似乎是,如果您的应用程序产生错误,那么它已经死了,无法保存。因此,如果您在 main 函数中发现错误,您的程序会变成僵尸吗?

如果程序已经崩溃,怎么能捕捉到错误呢?捕获错误真的可以做坏事吗?哪些错误最严重,哪些有时会被发现?您能否描述一个可以产生错误的小测试用例(比如真正产生错误,而不仅仅是抛出错误),以便我可以看到如果我捕捉到错误并忽略它们,它们会发生什么?

最佳答案

除了抛出的物体被捕获外,并没有发生什么。不过,您的流程可能处于不利位置,具体取决于导致错误的原因。

A StackOverflowError捕获起来非常平淡 - 当超过最大堆栈深度时抛出它,并且因为它随后开始弹出调用堆栈,所以它不再是问题(除非您再次尝试调用有问题的方法)。

class SO {
    static int stackOverflow(){ return stackOverflow(); }
    public static void main(String... args) {
        try {
            stackOverflow();
        } catch (StackOverflowError e) {
            System.out.println("Oh well, life goes on.");
        }
    }
}

其他错误,例如 OutOfMemoryError , 问题有点多——抛出后仍然会使用太多内存。有些是直接致命的,比如ClassFormatError ,这意味着您正在尝试加载损坏的类文件(并且它通常被扔在您无法捕获的地方)。

其他错误介于两者之间。 AssertionError ,例如,在不满足程序员定义的条件(如 assert answer == 42;)时抛出,但前提是您启用了断言。

不过,长话短说:如果您发现了特定的错误,那么您可能做错了事(除非您真的知道自己在做什么!)。如果您正在运行一个服务器应用程序并希望它继续运行,您可能最好让当前线程或进程终止并由某种监视器重新启动它。

关于java - 如果我发现错误会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29674735/

相关文章:

java - 使用 GeoTools 坐标投影

java - Android:AsyncTask 强制关闭

browser - Xpages浏览器错误

javascript - Node.js v12.x 如何设置 Error.code 属性?

java - 某些设备上的 setBackgroundDrawable 错误

java - Java 中是否有任何方法可以在运行时访问有关类型的信息而无需完全加载类?

java - 时间到后弹出带有倒计时器的Activity,如何杀死它?

php - Codeigniter 数据库连接错误

php - 文件上传中的PHP错误处理

javascript - 在 IE 中抑制 "Done, but with errors on page"