Java 什么';try/catch块捕获异常的意义何在?

Java 什么';try/catch块捕获异常的意义何在?,java,exception,Java,Exception,为什么我们需要try/catch块来捕获代码中可能出现的任何异常?一旦我们运行程序并假设我们有一个RuntimeException,程序不会自动中止并给出错误吗?那么,我们为什么需要try/catch块来完成这项工作呢 因为如果不捕获异常,整个方法执行将简单地停止,包括任何调用方法的执行。因此,如果方法a需要方法B中的某些内容并调用它,而方法B抛出异常,那么该异常将导致方法a停止执行。如果方法A被另一个方法调用,如果该方法没有从方法B捕获异常,该方法也将停止执行。因此,异常将沿着方法调用链向上运

为什么我们需要try/catch块来捕获代码中可能出现的任何异常?一旦我们运行程序并假设我们有一个RuntimeException,程序不会自动中止并给出错误吗?那么,我们为什么需要try/catch块来完成这项工作呢

因为如果不捕获异常,整个方法执行将简单地停止,包括任何调用方法的执行。因此,如果方法a需要方法B中的某些内容并调用它,而方法B抛出异常,那么该异常将导致方法a停止执行。如果方法A被另一个方法调用,如果该方法没有从方法B捕获异常,该方法也将停止执行。因此,异常将沿着方法调用链向上运行,直到被方法捕获或到达最上层/最外层的方法

此外,任何不是从
RuntimeException
类继承的异常,或者不是
RuntimeException
类本身的实例的异常都必须被捕获,否则代码将无法编译。如果您确实不想处理这种异常,那么您也可以通过向方法签名添加
抛出异常
,让调用方法接收异常。runtimeexception扩展类称为
未选中的
异常,您不必将其包含在方法或方法签名中。任何扩展异常而不是RuntimeException的都称为
已检查的
异常,应该使用
throws
关键字捕获或放入方法签名中


编辑:在这里你也可以找到一个很好的解释

这只是一个很好的实践。如果给用户一些类似“IndexOutOfrangeexception”的东西,他将如何处理它?假设一切都好,他应该重新开始?如果使用该软件进行一些工作,工作是否丢失?发生了什么事

把你自己放在这样的状态:你下载了一些软件,你开始像平常一样使用它,并且你对它感到满意。但有一天你们运行程序,它会给你们错误,程序就会死掉——你们知道发生了什么吗?不,你知道出了什么问题吗?不知道。你知道如何防止它并开始使用软件,这样错误就不会再次发生了吗?没有

你是开发者,你知道里面发生了什么。例如,您试图在数据库中保存数据,但不知何故连接丢失,您可能会遇到异常-在catch块中,您可以捕获此异常并向用户提供有意义的信息,例如:“与数据库的连接丢失。请检查网络。您的数据未保存,您应该重新执行此工作。”-这不是比stacktrace旁边的一些“SQL异常”更好吗

此外,catch/finally块用于清理潜在的混乱,例如,您正在将某些内容写入文件,但只有在您可以写入所有数据而不仅仅是其中的一部分时,它才有意义。因此,在catch块中,您可以删除不完整的数据,例如,这样文件就不会损坏


另外,在处理未归档的资源时,应该使用finally block来清理它们(例如DB/netowrk连接)。

考虑处理实时网站或应用程序时的场景。您不希望用户看到空白屏幕或充满错误跟踪代码的屏幕。在这种情况下,可以处理潜在的异常区域,向用户显示一条有意义的消息:“对不起,您的购物车中的物品超过了10个,等等”,“您的帐户中没有足够的金额”,“用户名不能有符号”,“我们现在无法运行,请稍后再来”

Try-catch用于优雅地处理此类错误情况。您可以将一个代码集封装到try中,它的catch负责处理它。处理可能取决于您的用例,但您的java程序不会终止


突然终止程序不会让您知道失败的实际原因

除了用户给出的示例之外,在Android上进行特定于硬件的操作时,例如camera,可以抛出运行时异常,即使你做的每件事都是正确的,它在基于设备的camera上做了很多。我将ISO设置为camera,这对我的应用程序的运行来说并不重要,但我不希望我的应用程序崩溃,所以我抛出一个异常并向用户显示一个警告,这样应用程序才能继续工作。

正是为了避免程序中止。但你通常不会发现“任何可能出现的例外情况”。您可以捕获可以以有意义的方式处理的异常。假设您要求用户输入日期,他/她输入垃圾。你不想让程序崩溃。您希望捕获解析异常并要求用户修复输入并再次输入有效日期。这是否回答了您的问题?此外,RuntimeException扩展了异常。因此,您对什么是选中异常的解释并不准确。@JBNizet我知道这一点,但传播或捕获运行时异常或扩展该类权限的异常并不是强制性的。这并不能使此语句为true=“任何扩展异常都称为选中异常”。