Java 为什么不需要处理可调用接口引发的异常

Java 为什么不需要处理可调用接口引发的异常,java,exception,callable,Java,Exception,Callable,我有这样的代码截取: import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class UserManagementApplication { public static void main

我有这样的代码截取:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class UserManagementApplication {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService es = Executors.newSingleThreadExecutor();
        MyCallable callable = new MyCallable(10);
        MyThread thread = new MyThread(10);
        System.out.println(es.submit(callable).get());
        System.out.println(es.submit(thread).get());
        es.shutdown();
    }
}

class MyCallable implements Callable<Integer> {
    private Integer i;

    public MyCallable(Integer i) {
        this.i = i;
    }

    @Override
    public Integer call() throws Exception {
        return --i;
    }
}

class MyThread extends Thread {
    private int i;

    MyThread(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        i++;
    }
}
import java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共类用户管理应用程序{
公共静态void main(字符串[]args)引发InterruptedException、ExecutionException{
ExecutorService es=Executors.newSingleThreadExecutor();
MyCallable callable=新的MyCallable(10);
MyThread线程=新的MyThread(10);
System.out.println(es.submit(callable.get());
System.out.println(es.submit(thread.get());
es.shutdown();
}
}
类MyCallable实现了Callable{
私有整数i;
公共MyCallable(整数i){
这个。i=i;
}
@凌驾
公共整数调用()引发异常{
return--i;
}
}
类MyThread扩展线程{
私人互联网i;
神话阅读(int i){
这个。i=i;
}
@凌驾
公开募捐{
i++;
}
}
我不明白为什么编译器没有在main中抱怨,因为MyCallable有一个声明为抛出异常的方法。 我确信我在这里遗漏了一些明显的东西,但只是我现在看不到而已。
谢谢

异常是在一个单独的线程中抛出的,因此您不需要直接在主线程中处理它。如果
call()
抛出异常,则单独的线程将通过
ExecutionException
通知您


您需要了解,如果一个线程由于错误而终止,它不会终止主线程或任何其他线程,因为它们是分离的线程。只有在代码本身运行的线程中可以抛出异常时,处理异常才相关。

稍微简化了一点,但是:只有在实际调用方法时才需要处理异常。尝试将
callable.call()
添加到您的
main
方法中。是的,有一个错误,我一直在寻找:))放在一边:如果您不抛出选中的异常,您实际上不必在
call()
上抛出异常。是的,这是有意义的。还有一个问题,ExecutionException继承自Exception。调用方法定义声明一个抛出异常。如果ExecutionException是Exception的子类,那么在这个分离的线程中如何抛出异常呢?我不知道我在这里有多清楚。@Adrian当线程终止
ExecutorService
时,会注意到/为您处理。
call()
方法的异常不会传递给主线程。调用发生,出现问题,分离的线程终止,服务注意到线程终止,并抛出一个
ExecutionException