尝试使用Java捕获 - 发生异常时会发生什么?

时间:2015-11-11 08:43:36

标签: java exception try-catch

我对Java中的try / catch和异常有疑问。我知道这应该是基础知识,但我想我错过了一部分了解它是如何工作的。以此代码为例:

String res = "";

try {
    res = methodThatCanThrowException();
    res = res + ".txt";
} catch (Exception e) {
    res = "somethingwentwrong.txt";
}

return res;

我保证在try和catch块中永远不会设置'res'吗?如果在try块中的methodcall中抛出异常,代码控件将直接进入catch块,对吧?是否有任何情况在try和catch块中都会给'res'赋值?

5 个答案:

答案 0 :(得分:2)

您可以获得的最佳答案来自JLS - 14.20.1. Execution of try-catch

  

首先执行try块,执行没有finally块的try语句。然后有一个选择:

     

...

     

如果V的运行时类型与{§5.2}的try语句的任何catch子句的可捕获异常类兼容,那么第一个(最左边)这样{{1} }子句被选中。值catch被赋值给所选V子句的参数,并执行该catch子句的块...

我不想粘贴整个部分因为它很大,我强烈建议你通过它来更好地理解 try-catch-finally 的机制。

答案 1 :(得分:1)

如果methodThatCanThrowException引发异常,则res无法在try块中分配,因此只有catch块会分配它(假设您已修复)你的拦截块。)

但是,即使在已经分配了res之后抛出异常,catch块也会用新值覆盖它,因此如果两者都分配了它就无关紧要。

答案 2 :(得分:0)

你是对的。如果methodThatCanThrowException抛出一个execption,它将跳转到res = "somethingwentwrong.txt";。从来没有两种情况都有这种情况

答案 3 :(得分:0)

如果try块中没有异常,则永远不会执行catch块。

另一方面,如果发生异常,控制流将从try块移动到catch块,res变量将被覆盖,无论它是什么你在catch街区。

在您的情况下,res将包含附加methodTatCanThrowException().txt的{​​{1}}返回内容。

作为旁注,您可能还想查看somethingwentwrong.txt块及其功能。

答案 4 :(得分:0)

当try块内发生异常时,控制直接进入catch块,因此try块内不会执行其他代码,res的值也不会改变。 当方法抛出异常时,它不会返回任何内容。因此,在异常的情况下,res只会在try catch块之外初始化时设置一次,然后在catch块内部时设置。

从不超过两次