Java中的TryCatch-发生异常时会发生什么?

Java中的TryCatch-发生异常时会发生什么?,java,exception,try-catch,Java,Exception,Try Catch,我有一个关于Java中的try/catch和异常的问题。我知道这应该是基础知识,但我想我错过了一部分了解这是如何工作的。例如,给定此代码: String res = ""; try { res = methodThatCanThrowException(); res = res + ".txt"; } catch (Exception e) { res = "somethingwentwrong.txt"; } return res; 我是否保证“res”永远不会在

我有一个关于Java中的try/catch和异常的问题。我知道这应该是基础知识,但我想我错过了一部分了解这是如何工作的。例如,给定此代码:

String res = "";

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

return res;

我是否保证“res”永远不会在try和catch块中设置?如果在try块的methodcall中抛出异常,那么代码控件将直接转到catch块,对吗?是否存在在try和catch块中都给“res”赋值的情况

如果CanthRowexException的
方法抛出异常,
res
将不会在
try
块中分配,因此只有
catch
块会分配它(假设您修复了catch块)


但是,即使异常是在分配了
res
之后引发的,catch块也会用一个新值覆盖它,因此,如果两者都分配了它,这并不重要。

你是对的。如果canthrowexception的
方法抛出一个执行选项,它将跳转到
res=“somethingwentwrong.txt”。如果在
try
块中没有发生异常,则将永远不会执行
catch

另一方面,如果发生异常,控制流将从
try
块移动到
catch
块,并且
res
变量将被
catch
块中的任何变量覆盖

在您的情况下,
res
将有任何
methodTatCanThrowException()
返回并附加
.txt
,或者
somethingwentwrong.txt


作为旁注,您可能还希望查看
finally
块及其作用。

您可以从以下内容中获得最佳答案:

通过首先执行
try
块来执行没有
finally
块的
try
语句。还有一个选择:

如果
V
的运行时类型与
try
语句的任何catch子句的可捕获异常类(§5.2)赋值兼容,则选择第一个(最左边的)此类
catch
子句。将值
V
分配给所选的
catch
子句的参数,并执行该catch子句的块


我不想粘贴整个部分,因为它很大,我强烈建议您仔细阅读它,以便更好地理解try-catch-finally的机制。

当try块内发生异常时,控件直接转到catch块,因此try块内不会执行其他代码,res的值也不会更改此外,当方法引发异常时,它不会返回任何内容。因此,在异常情况下,res仅在try-catch块外部初始化时设置一次,然后在catch块内部初始化时设置一次


您的代码无法编译的次数不得超过两次。你应该抓住什么东西……是的。马龙是对的。如果你发现了异常。然后res将被设置为catch块中使用的值,以确定您是否需要了解,即使methodcall中抛出的异常“吞咽”了异常?@user16655什么异常吞咽了什么异常?如果
methodThatCanThrowException
抛出异常并在内部捕获它,这意味着
methodThatCanThrowException
没有向其调用者抛出异常,并且try块将为
res
赋值。啊,但是如果methodThatCanThrowException()在内部处理异常?这让我有点明智:)@user16655是的,如果在内部处理异常,代码段中的catch块将不会执行。