我读到 throws 关键字不能与线程的 run 方法一起使用。我想知道它是设计错误还是有不允许这样做的真正原因。
5 回答
主要原因是没有人可以捕获异常,除了您可能在您的Thread
或包含的ThreadGroup
.
请注意,您仍然可以抛出一个RuntimeException
,它最终会出现在上述处理程序中。
run()
(顺便说一下, s 的返回值也可以使用同样的推理void
。)
Thread.run()
被声明为不抛出已检查异常,原因与static main(String args)
Java 控制台应用程序中的 (这两种方法通常由 Java 运行时环境调用,而不是由您的代码调用。)请注意,这两种方法仍然可以引发未经检查的异常(RuntimeException
、Error
及其子类)。Java 运行时环境将处理这些(通常以一种不太优雅的方式)。
好吧,Runnable's
run()
方法不能返回,也不能抛出任何已检查的异常......很可能Java的设计者认为它不值得在一个单独的线程上抛出异常,这主要是一个单独的进程......
但后来从Java 1.5 Callable<T>
接口开始带有可以返回并抛出检查异常的call()
方法......
问题是调用上下文无法获取返回值或异常,因为它现在在新上下文中运行(这就是新线程的全部含义)。但是你可以使用 Thread.setDefaultUncaughtExceptionHandler ()
运行本身不会抛出异常。当你调用 .start() (调用 run() 函数)时,你所做的只是告诉程序继续沿着新线程的路径前进。run() 函数中的函数调用和所有内容都可能引发异常。run() 本身没有可能的运行时错误。如果出现运行时错误,那是因为您的进程资源管理器、处理程序或某些操作系统级别的问题发生了,那么您的程序无法处理任何事情。