为什么我们需要try / catch块来捕获代码中可能出现的任何异常?一旦运行程序并假设我们有RuntimeException,程序是否会自动终止并给我们错误?那么为什么我们需要try / catch块来为我们做呢?
答案 0 :(得分:6)
这只是一个好习惯。如果给用户提供诸如“ IndexOutOfrangeexception”之类的东西,他将如何处理?只是假设一切都好,他应该重新开始吗?在使用软件进行某些工作时会丢失工作吗?发生什么事了?
让自己陷入困境:您下载了一些软件,开始按常规使用它,并对它感到满意。但是有一天,您运行程序,却给您错误和程序死机-您知道发生了什么吗?否。您知道出了什么问题吗?否。您知道如何防止它并开始使用软件,从而使该错误不再发生吗?不。
您是开发者,您知道里面发生了什么。因此,例如,您尝试将数据保存在数据库中,但是以某种方式丢失了连接并且您可能会遇到异常-在catch块中,您可以捕获此异常并为用户提供MEANINGFUL信息,例如“与数据库的连接已丢失。请检查网络。您的数据没有保存,您应该再次进行工作。” -不仅仅是一些“ SQL异常”以及stacktrace吗?
此外,这里还可以使用catch / finally块来清理潜在的混乱情况,例如,您正在向文件中写入一些内容,但这仅在您可以写入所有数据时才有意义,而不仅仅是部分数据。因此,在catch块中,您可以擦除不完整的数据,例如,文件不会损坏。
此外,在使用未老化的资源时,您应该使用finally块进行清理(例如,DB / netowrk连接)。
答案 1 :(得分:2)
考虑使用实时网站或应用程序时的场景。您不希望用户看到空白屏幕或充满错误跟踪代码的屏幕。在这种情况下,可以处理潜在的异常区域以向用户显示一条消息,“对不起,您购物车中的物品超过10件,等等”,“您的帐户中没有足够的金额”,“用户名不能带有符号“,”“请立即退出服务,请稍后再回来”。
Try catch用于优雅地处理此类错误情况。您可以将代码集放入try中,并且它的catch负责处理它。处理可能取决于您的用例,但是您的Java程序不会终止。
程序的突然终止不会让您知道失败的实际原因。
答案 2 :(得分:1)
因为如果您没有捕获到异常,则整个方法的执行将简单地停止,包括任何调用方法的执行。因此,如果方法A需要某种方法B并调用它,而方法B引发异常,则该异常将导致方法A停止执行。如果方法A被另一个方法调用,那么如果该方法没有捕获到方法B的异常,该方法也将停止执行。因此,异常将沿方法调用链向上移动,直到被方法捕获或到达该方法为止。最高级/最高级的方法。
此外,任何不是从RuntimeException
类继承的或不是RuntimeException
类本身的实例的异常都必须被捕获,否则您的代码将无法编译。如果您确实不想处理此类异常,则还可以通过在方法签名中添加throws Exception
来让调用方法接收该异常。 runtimeexception扩展类称为unchecked
异常,您不必将其包含在方法或方法签名中。任何扩展Exception而不是RuntimeException的扩展都称为checked
异常,应该使用throws
关键字捕获或放入方法签名中。
编辑:在这里您也可以找到很好的解释Does every exception have an required try-catch?
答案 3 :(得分:0)
除了提供给用户的示例之外,在Android上针对硬件的特定操作(例如,摄像头),即使您做得正确,也可能引发RuntimeExceptions,这对于基于设备的摄像头来说非常有用。我将ISO设置为例如相机,这对于我的应用程序正常工作并不是至关重要的,但是我不希望我的应用程序崩溃,因此我抛出异常并向用户显示警告,因此应用程序可以继续工作。