2

我读到 throws 关键字不能与线程的 run 方法一起使用。我想知道它是设计错误还是有不允许这样做的真正原因。

4

5 回答 5

2

主要原因是没有人可以捕获异常,除了您可能在您的Thread或包含的ThreadGroup.

请注意,您仍然可以抛出一个RuntimeException,它最终会出现在上述处理程序中。

run()(顺便说一下, s 的返回值也可以使用同样的推理void。)

于 2012-09-06T17:36:22.770 回答
2

Thread.run()被声明为不抛出已检查异常,原因与static main(String args)Java 控制台应用程序中的 (这两种方法通常由 Java 运行时环境调用,而不是由您的代码调用。)请注意,这两种方法仍然可以引发未经检查的异常(RuntimeExceptionError及其子类)。Java 运行时环境将处理这些(通常以一种不太优雅的方式)。

于 2012-09-06T17:42:23.967 回答
1

好吧,Runnable's run()方法不能返回,也不能抛出任何已检查的异常......很可能Java的设计者认为它不值得在一个单独的线程上抛出异常,这主要是一个单独的进程......

但后来从Java 1.5 Callable<T>接口开始带有可以返回并抛出检查异常的call()方法......

于 2012-09-06T17:32:32.097 回答
1

问题是调用上下文无法获取返回值或异常,因为它现在在新上下文中运行(这就是新线程的全部含义)。但是你可以使用 Thread.setDefaultUncaughtExceptionHandler ()

于 2012-09-06T17:38:46.073 回答
0

运行本身不会抛出异常。当你调用 .start() (调用 run() 函数)时,你所做的只是告诉程序继续沿着新线程的路径前进。run() 函数中的函数调用和所有内容都可能引发异常。run() 本身没有可能的运行时错误。如果出现运行时错误,那是因为您的进程资源管理器、处理程序或某些操作系统级别的问题发生了,那么您的程序无法处理任何事情。

于 2012-09-06T17:40:16.937 回答