首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java异常处理机制

Java异常处理机制
EN

Stack Overflow用户
提问于 2010-09-09 13:41:16
回答 2查看 1.2K关注 0票数 1

在Java语言中,如果我没有捕捉到抛出的异常,那么线程执行就会停止,否则,如果我捕捉到了相同的异常,那么在以这种方式设计的catch block.Why Java异常处理之后,线程的执行会继续。

Thx

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-09 13:49:31

异常的目的是让程序理解发生了一些奇怪的事情,所以做通常在程序中的下一步很可能是错误的。你调用的一个函数不能给你一个真正的答案,而你依赖于那个答案,所以它不得不阻止你。

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

如果您的程序在发生这些事情时不知道该怎么办,最好是什么都不做。让异常使线程崩溃,然后您可以稍后查看崩溃日志,找出究竟是什么导致程序崩溃以及原因。如果您的程序不能处理错误,则异常的“使线程崩溃”行为允许您查看未处理的错误,因此您可以更改程序,使其能够在将来处理这种情况,或者防止这种情况发生。

然而,一些错误可能是很正常的,不应该停止整个程序-您需要有一种方法来恢复它们。这就是catch块的作用:有机会说"Hello Java,我知道如何解决这个问题“,然后就去做。Catch块使您可以清理程序并继续前进。Java假定Catch块处理了这个问题,并使其消失。如果有一个新的问题,或者同样的问题,你需要再次throw捕获的异常,或者可能是一个新的,这样其他人就可以尝试解决这个问题-即使这个人是你,作为一个程序员。

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

票数 5
EN

Stack Overflow用户

发布于 2010-09-09 14:17:51

在Java语言中,如果我没有捕捉到抛出的异常,那么线程的执行就会停止,否则如果我捕捉到了相同的异常,那么线程的执行就会在

块之后继续。

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

为什么

异常处理是这样设计的。

因为另一种选择要糟糕得多。在大多数情况下。

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

但未捕获的异常通常意味着发生了一些不好的事情。典型的run()方法并不是专门设计的,所以多次使用它们可以做一些明智的事情。如果run()方法由于某种未知原因而失败(就run()方法而言),那么再次调用它的可能性就更小了。

此外,在少数情况下,您的run()方法捕获并恢复每个异常是明智的,您始终可以通过编写代码来实现这一点。如果你不想让线程继续,你可以实现一个“未捕获的异常处理程序”来通知其他事情,并且(也许)开始更高级别的恢复。

对于当前的设计,唯一有一点问题的是,由于未捕获的异常而导致的线程终止通常是静默的。但解决方法是实现一个默认的未捕获异常处理程序,该处理程序会产生一些噪音。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3674066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档