Java中的TryCatch-发生异常时会发生什么?
我有一个关于Java中的try/catch和异常的问题。我知道这应该是基础知识,但我想我错过了一部分了解这是如何工作的。例如,给定此代码: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”永远不会在
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块将不会执行。