在Java语言中,如果我没有捕捉到抛出的异常,那么线程执行就会停止,否则,如果我捕捉到了相同的异常,那么在以这种方式设计的catch block.Why Java异常处理之后,线程的执行会继续。
Thx
发布于 2010-09-09 13:49:31
异常的目的是让程序理解发生了一些奇怪的事情,所以做通常在程序中的下一步很可能是错误的。你调用的一个函数不能给你一个真正的答案,而你依赖于那个答案,所以它不得不阻止你。
有两种方法可以结束这个过程:处理异常(通过catch块),或者整个程序停止。
如果您的程序在发生这些事情时不知道该怎么办,最好是什么都不做。让异常使线程崩溃,然后您可以稍后查看崩溃日志,找出究竟是什么导致程序崩溃以及原因。如果您的程序不能处理错误,则异常的“使线程崩溃”行为允许您查看未处理的错误,因此您可以更改程序,使其能够在将来处理这种情况,或者防止这种情况发生。
然而,一些错误可能是很正常的,不应该停止整个程序-您需要有一种方法来恢复它们。这就是catch块的作用:有机会说"Hello Java,我知道如何解决这个问题“,然后就去做。Catch块使您可以清理程序并继续前进。Java假定Catch块处理了这个问题,并使其消失。如果有一个新的问题,或者同样的问题,你需要再次throw捕获的异常,或者可能是一个新的,这样其他人就可以尝试解决这个问题-即使这个人是你,作为一个程序员。
如果异常总是使程序崩溃,那么就没有办法处理预期的和可以处理的错误。但如果完全没有准备好处理错误,程序就不能继续运行,因为现在有些事情变得奇怪了,它不知道该做什么,因为你没有编程让它做任何事情。
发布于 2010-09-09 14:17:51
在Java语言中,如果我没有捕捉到抛出的异常,那么线程的执行就会停止,否则如果我捕捉到了相同的异常,那么线程的执行就会在
块之后继续。
还有第三种情况。如果线程有一个Thread.UncaughtExceptionHandler (通过调用thread.setUncaughtExceptionHandler(handler)注册,那么它将在线程堆栈上发生未捕获的异常时得到通知...在线程退出之前。(实际上,行为要比这复杂一些;请参阅javadoc。)
为什么
异常处理是这样设计的。
因为另一种选择要糟糕得多。在大多数情况下。
假设线程已经导致run()方法终止(因为您没有捕捉到异常),那么您唯一可以“不停止”的事情就是让线程基础结构再次调用run()。
但未捕获的异常通常意味着发生了一些不好的事情。典型的run()方法并不是专门设计的,所以多次使用它们可以做一些明智的事情。如果run()方法由于某种未知原因而失败(就run()方法而言),那么再次调用它的可能性就更小了。
此外,在少数情况下,您的run()方法捕获并恢复每个异常是明智的,您始终可以通过编写代码来实现这一点。如果你不想让线程继续,你可以实现一个“未捕获的异常处理程序”来通知其他事情,并且(也许)开始更高级别的恢复。
对于当前的设计,唯一有一点问题的是,由于未捕获的异常而导致的线程终止通常是静默的。但解决方法是实现一个默认的未捕获异常处理程序,该处理程序会产生一些噪音。
https://stackoverflow.com/questions/3674066
复制相似问题