0

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

但我想知道为什么 java 允许 run 在限制 Handled 异常的同时抛出 Unhanlded Exception 以及 run() 抛出 Unhandled Exception 时还会发生什么?

父线程

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)
4

2 回答 2

1

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

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero

不是Exception in thread "main" java.lang.ArithmeticException: / by zero

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

于 2012-11-25T10:32:25.173 回答
0

首先,所有方法都可能抛出未经检查的异常。

接下来,run()不抛出已检查异常的简单原因是没有人可以捕获它们!该方法作为其“主”方法从启动的线程中调用——它是顶级入口点。它上面没有任何东西可以处理异常,所以声明一个抛出异常的方法是没有意义的。

于 2012-11-25T10:44:41.423 回答