gpt4 book ai didi

java - 为什么java允许run()抛出Unhandled Exception而限制Handled Exception?

转载 作者:行者123 更新时间:2023-12-01 15:01:41 25 4
gpt4 key购买 nike

据说运行不会抛出已处理的异常。 JVM 简单地忽略它们。所以我抛出了未处理的异常(ArithmeticException)。但同样的事情也发生了。我知道尝试从标记为 XXX 的 catch 子句启动的线程中捕获异常是荒谬的。因为处决可能已经超过了那条线。

但是我想知道为什么java允许run抛出未处理的异常,同时限制已处理的异常,以及当run()抛出未处理的异常时会发生什么?

父线程

public class Parent {

public static void main(String[] args) {

Child child = new Child();
Thread chThread = new Thread(child);

try {
chThread.start();

} catch (Exception e) { // XXX mark
System.err.println("XXX");
e.printStackTrace();
}

}

子线程

public class Child implements Runnable {

@Override
public void run() throws ArithmeticException{
method0(); // line 8
}

public void method0(){
int i = 0/0; // line 12
}
}

java.lang.Thread

public class Thread implements Runnable {
public void run() {
if (target != null) {
target.run(); // line 619
}
}
}

堆栈跟踪

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
at seperateStacksPerThread.Child.method0(Child.java:12)
at seperateStacksPerThread.Child.run(Child.java:8)
at java.lang.Thread.run(Thread.java:619)

最佳答案

run() 的签名不包含已检查的异常。因此,您无法覆盖它以引发已检查的异常(当您覆盖时,您永远不会受到更多限制)。
但是抛出未经检查的异常是允许的,因为它不是签名的一部分(不需要任何人捕获它)。
当您抛出算术异常时,它是不同线程的堆栈跟踪的一部分。
请注意,它说:

线程“Thread-0”中的异常java.lang.ArithmeticException:/由零

并且不是:线程“main”java.lang.ArithmeticException中的异常:/由零

现在为什么不允许检查异常,这是一个设计决策,我认为这是因为无论如何都没有人可以捕获它们,因为线程是一个单独的执行流

关于java - 为什么java允许run()抛出Unhandled Exception而限制Handled Exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com