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/