在Java中,如果我没有捕获抛出的Exception,那么Thread执行会在其他地方停止,如果我抓住它,那么在catch块之后继续执行Thread.Why以这种方式设计Java异常处理。
THX
答案 0 :(得分:5)
例外的目的是让程序理解发生了奇怪的事情,因此在程序中通常会做的事情很可能是错误的。你打电话的一个功能无法给你一个真正的答案,你依靠的是答案,所以它必须阻止你。
有两种方法可以结束:你处理异常(通过一个catch块),或整个程序停止。
如果你的程序在这些事情发生时不知道该怎么做,最好什么也不做。让异常崩溃线程,然后您可以稍后检查崩溃日志,并找出崩溃程序的原因以及原因。如果您的程序无法处理错误,Exception的“崩溃线程”行为可以让您查看未处理的错误,因此您可以更改程序以使其能够在将来处理此类情况,或者防止出现这种情况来自发生。
但是,有些错误可能很正常,并且不应该停止整个程序 - 您需要有办法从它们中恢复。这就是catch块的用途:有机会说“Hello Java,我知道如何处理这个问题”,然后去做。如果可以,Catch块可让您清理程序并继续前进。 Java假设您的Catch块处理问题并使其消失。如果出现了新的问题,或者同一个问题,你需要再次throw
捕获的异常,或者可能是新的异常,所以其他东西可以尝试解决问题 - 即使你还有别的东西,作为一名程序员。
如果异常总是使程序崩溃,则无法处理预期的错误并且可以处理。但是如果没有任何东西准备好处理错误,那么程序就无法继续运行,因为现在有些东西变得怪异了,它不知道该做什么,因为你没有对它进行编程以做任何事情。
答案 1 :(得分:1)
在Java中,如果我没有捕获抛出的Exception,那么Thread执行会在其他地方停止,如果我捕获它,那么在catch块之后继续执行Thread。
还有第三种情况。如果线程有一个Thread.UncaughtExceptionHandler
(通过调用thread.setUncaughtExceptionHandler(handler)
注册),那么在线程堆栈发生未被捕获的异常时会通知它...在线程退出之前。 (事实上,行为比这更复杂;请参阅javadoc。)
为什么以这种方式设计Java异常处理。
因为在大多数情况下,替代方案要差得多。
假设线程已导致run()
方法终止('你没有捕获异常),那么你唯一可以“不停止”的就是调用线程基础结构{{ 1}}再次。
但未被捕获的异常通常意味着发生了一些事情。典型的run()
方法并非如此设计,因此它们可以多次执行合理的操作。如果run()
方法因某些未知原因而失败(就run()
方法而言),则再次调用它的可能性更小。< / p>
此外,在少数情况下,您的run()
方法可以捕获并从每个异常中恢复,您可以随时对其进行编码。如果您不希望线程恢复,您可以实现一个“未捕获的异常处理程序”来通知其他内容并(可能)启动更高级别的恢复。
对于当前设计唯一可能有点可疑的是由于未捕获的异常而导致的线程终止通常是静默的。但解决这个问题的方法是实现一个默认的未捕获异常处理程序,它会产生一些噪音......