java - java中 "It is impossible to recover from errors"是什么意思?

标签 java exception out-of-memory stack-overflow unchecked-exception

Here说不可能从错误中恢复。 我不确定这是什么意思,因为我可以像捕获异常一样捕获错误。 例如:

public static void main(String args[]) {
    while (true) {
        try {
            throw new StackOverflowError("stackoverflow");
        } catch (Throwable throwable) {
            //do something
        }
        //program recover and continue to execute
    }
}

上面的程序执行正常,并且似乎可以从错误中恢复。有人可以帮忙吗?

更新:

stackoverflow 的例子有点令人费解,只有白痴才想从 stackoverflow 中恢复。这是关于 OutOfMemory 的另一个示例:

public class Main {
    public static Map<Long, Object> cache = null;
    public static void main(String args[]){
        while(true){
            try {
                if(cache == null) {
                    cache = new HashMap<>();
                }
                for (long i = 0; i < Long.MAX_VALUE; ++i) {
                    cache.put(i, i);
                }
            }catch(OutOfMemoryError error) {
                cache.clear();//delete some unused entry or clear all.
                cache = null;
                System.gc();
                System.out.println("release memory");
            }
        }
    }
} 

这是一个简单的HashMap缓存,使用java -Xmx1m Main执行代码,很快我们就会看到OutOfMemoryError,然后手动释放内存,程序就会继续执行。插入-> OutOfMemoryError -> 释放-> 插入... 看?程序已从 OutOfMemoryError 中恢复。不是吗?我认为这是有意义的。那么,为什么有人仍然说程序无法从 OutOfMemoryError 中恢复。

最佳答案

显然,仅仅“捕获”异常的能力并不意味着您(总是......)能够恢复它...

...即:“出击,完全毫发无伤,就好像‘如此不便的事件’从来没有发生过一样。”

我认为原作者的要点或多或少是:即使泰坦尼克号上可怜的灵魂可能“捕获”了这个事实得知他们的船正在下沉,他们无法“恢复”这艘船并将其毫发无伤地驶向纽约。

--- 编辑: “现在,让我再补充一个想法!” (正如其他回答者在这里所做的那样。)有时,错误异常是故意在某些有意被抛出的代码块中“抛出”的。被一个捕捉 block 包围。

也许错误(它本身就是“对象”)是捕获器能够识别的特定用户定义类型。 (他可以“重新抛出”任何他不认识的东西,或者干脆拒绝捕获它。)这可能是一种非常优雅且有效的方式来处理“异常” 遵守规则。” (因此得名...)

每当一段代码遇到“千载难逢一次,但它确实发生了”的情况时,它就可以将异常抛向空中,因为知道最近的捕手捕获它。反过来,这个 catch 手可以识别刚刚落在他棒球手套上的东西,并做出相应的 react 。那里可以有任意数量的“捕手”,寻找不同的东西。

此策略不是“错误”,而是程序内有意的替代控制流。

关于java - java中 "It is impossible to recover from errors"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38387337/

相关文章:

java - 有效使用 JavaOptional.ofNullable

java - 如何从 Java 设置 Kerberos 票证生命周期?

JavaFX 虚拟键盘

python - 如何正确弃用 Python 中的自定义异常?

python - 如何使用Python 3.7 pdf2image库解决MemoryError?

android dalvik vm-heap 在 XZ 压缩时内存分配不足

java - 使用 JavaPoet 生成枚举

java - EJB 计时器 : put in a method with Exception, @Timeout 注释

java - java3D lib 配置的问题

exception - 处理 "java.lang.OutOfMemoryError: PermGen space"错误