我对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'赋值?
答案 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块内部时设置。
从不超过两次