Exception handling 使用try-catch和finally返回值
我需要解释下面的代码Exception handling 使用try-catch和finally返回值,exception-handling,try-catch,Exception Handling,Try Catch,我需要解释下面的代码 public class ReturnValueFromTryCatchFinally { public static void main(String[] args) { System.out.println(methodReturningValue()); } static String methodReturningValue() { String s = null; try
public class ReturnValueFromTryCatchFinally
{
public static void main(String[] args)
{
System.out.println(methodReturningValue());
}
static String methodReturningValue()
{
String s = null;
try
{
s = "return value from try block";
return s;
}
catch (Exception e)
{
s = s + "return value from catch block";
return s;
}
finally
{
s = s + "return value from finally block";
}
}
}
我的理解是,finally块将始终执行,因此s的值将是“try块的返回值finally块的返回值”。
但是上面的代码给出了try块中s的值。
即;从try块返回值。
为什么s的值是从try块返回的。据我所知,最终块将始终执行。那么s的值不会改变吗?关于try,catch块中的变量范围,有什么我需要了解的吗
这不仅发生在字符串中。即使我从try块返回整数,也会发生这种情况 s中的finally将被更改,但它不会影响try返回的内容。 当您在finally中更改s时,s只会用新文本指向内存中的另一个区域。但是try中的返回已经指向try中的文本,这不会改变 也许这样更容易理解。Java中的字符串是不可变的。如果更改字符串变量,则内存中以前的文本不会更改。相反,将创建一个新文本,变量仅“指向”新文本。在finally块中,您只需更改s指向的位置,就不能更改try块的文本 如果您有其他类型,如List和finally块中添加或删除了元素,这将影响try返回的内容 我想你只是简化了代码的可读性。对吗?因为在try块中,不可能出现异常,并且由于catch块,此代码将无法编译
s
与finally块中的s
不同。当s=s+“从最终块返回值”时代码>已分配新内存。try块中的返回
仍然引用旧的s
static ArrayList<String> methodReturningValue()
{
ArrayList<String> arr = new ArrayList<String>(5);
try
{
arr.add("try");
return arr;
}
catch (Exception e)
{
arr.add("catch");
return arr;
}
finally
{
arr.add("finally");
}
}
static ArrayList methodReturningValue()
{
ArrayList arr=新的ArrayList(5);
尝试
{
arr.add(“try”);
返回arr;
}
捕获(例外e)
{
arr.add(“catch”);
返回arr;
}
最后
{
arr.add(“最终”);
}
}
public class ReturnValueFromTryCatchFinally
{
public static void main(String[] args)
{
System.out.println(methodReturningValue());
}
static int methodReturningValue()
{
int i = 0;
try
{
i = 1;
return i;
}
catch (Exception e)
{
i = 2;
}
finally
{
i = 3;
}
return i;
}
}
我们正在传递整数。因此,它不应该返回3而不是1。@My Nguyen请检查我下面的答案,其中有一个示例,我尝试使用整数类型返回。在“try”块中,您已经将值1传递给了返回部分。如果以后更改变量“i”,则它没有效果。如果你看以下内容,可能更容易理解:试试。。。i=1;剂量测定法(i);最后i=3;这里,方法“doSomething”获得值1。如果你以后改变“i”,它没有效果。当执行“return”时,它类似于此函数调用。同样,您的代码是不可编译的。我认为这只是一种简化,假设在尝试部分中抛出一个异常。@ MeTalAlurg,请给我一个示例代码。“finally”可以更改“try”中返回的内容的示例?我已经在第一个答案中描述了它,“My Nguyen”甚至提供了我所描述的代码。@Sushm为了简单起见,您可以理解,在执行finally块后,return语句将被延迟,但它仍然指向指定的内存。在第二个示例中,最后一个
return
语句永远不会到达,因为在它执行finally块之后,程序返回try块中的return语句并返回。如果要返回3,请在finally blockCorrect中添加该返回。我在上面提到了名单。您甚至已经用代码说明了这一点。做得好。