2010-09-09 307 views
1

在Java中,如果我没有捕获抛出的异常,那么线程执行将在其他地方停止,如果我捕获相同的线程,则在catch块之后继续执行线程。为什么以这种方式设计Java异常处理。Java异常处理机制

THX

+0

这是一个非常广泛的问题来回答.Exceptions基本上是为处理异常情况而设计的,并提供了一个控制权,如果他想要通过捕捉它来做些什么,否则这个线程会抛出它,因为这种异常情况会导致错误的结果或应用程序的错误状态,从而导致进一步的问题。 – 2010-09-09 05:49:19

回答

5

异常的目的是为了让程序知道,奇怪的事情发生了,所以做什么,通常会在节目中下一个很可能是错误的。你所称的功能无法给你一个真正的答案,而你依赖于这个答案,所以它必须阻止你。

有两种方法可以结束:处理异常(通过catch块),或者整个程序停止。

如果您的程序在这些事情发生时不知道该怎么做,最好什么也不做。让异常崩溃的线程,然后你可以稍后检查崩溃日志,并找出崩溃的程序和原因。如果你的程序不能处理错误,Exception的“崩溃线程”行为可以让你看到什么错误是未处理的,所以你可以改变程序使它能够在将来处理这种情况,或者防止出现这种情况从发生。

虽然有些错误可能是非常正常的,但不应该阻止整个程序 - 您需要有一种方法从它们中恢复。这就是一个catch块:有机会说“Hello Java,我知道该怎么解决这个问题”,然后去做。如果可以,Catch块允许您清理程序并继续前进。 Java假设你的Catch块处理这个问题并使其消失。如果出现了新问题,或者同一个问题,您需要再次捕获异常,或者可能是新的问题,所以其他问题可以尝试解决问题 - 即使其他人是您,作为程序员。

如果异常总是使程序崩溃,那么将无法处理预期的错误并且可以处理。但是,如果完全没有准备好处理错误,程序就无法继续运行,因为现在有些事情变得很奇怪,并且它不知道该怎么做,因为你没有编程来做任何事情。

1

在Java中,如果我没有捕获抛出的异常,那么线程执行停止在那里,如果我捕获相同的线程执行继续catch块。

还有第三种情况。如果线程有Thread.UncaughtExceptionHandler(通过调用thread.setUncaughtExceptionHandler(handler)注册),则在线程退出之前,将在线程堆栈上发生未捕获的异常时通知它。 (实际上,这个行为比这更复杂;请参阅javadocs。)

为什么使用这种方式设计Java异常处理。

因为替代方案差很多......在大多数情况下。

假设线程已导致run()方法终止(因为您没有发现异常),那么您唯一可以做的事情就是“不停止”,这将使线程基础结构再次调用run()

但未捕获的异常通常意味着发生了一些不良事件。典型的run()方法没有设计,所以他们多次会做一些明智的事情。如果run()方法刚刚失败了一些未知的原因(就run()方法而言),更不可能再次调用它。

此外,在少数情况下,如果您的run()方法能够从每个异常中捕获并恢复,您可以随时对其进行编码。如果你不想让线程恢复,你可以实现一个“未捕获的异常处理程序”来通知别的事情,并且(可能)开始更高级别的恢复。

唯一可能是可能是有问题的关于当前的设计是由于未捕获的异常导致线程终止往往是沉默的。但是,治疗的目的是实现一个默认的未捕获的异常处理程序,它会产生一些噪音......