最终的返回值将会是C
因为 finally
块总是在 try
和 catch
块之后执行,无论是否有异常发生。如果finally块中有一个return语句,它将夏盖try块和catch块中的任何return语句。
//无异常情况
public static string getValue() {
try {
return "A" ;
} catch (Exception e) {
return "B" ;
} finally {
return "C" ;
}
}
//有异常情说
public static string getValue() {
try {
System.out.println( 1 / 0 );
return "A" ;
} catch (Exception e) {
return "B" ;
} finally {
return "C" ;
}
}
所以在这种情况下,无论 try
和 catch
块的执行情况如何,finally
块中的 return C
;总是最后执行的语句并目其返回值将是整个代码块的返回值。
这个问题还有一个孪生问题,那就是如下代码得到的结果是什么:
public static void getValue() {
int i = 0;
try {
i = 1;
} catch (Exception e) {
i = 3;
} finally {
i = 5;
}
System.out.println(i);
}
原理和上面的是一样的,最终输出内容为5。
很多时候,我们的一个方法会通过return返回一个值,那么如以下代码:
public static int getValue() {
int i = 1;
try {
++i;
return i;
} catch (Exception e) {
i = 66;
} finally {
i = 100;
}
return i;
}
这人代码得到的结果是2,try-catch-finally的执行顺序是try->finally或者try-catch-finally,然后在护行每一个代码块的过程中,如果遇到return那么就会把当前的结果暂存,然后再执行后面的代码块,然后再把之前暂存的结果返回回去。
所以以上代码,会先把 ++i
即 2 的结果暂存,然后执行 i=100,接着再把 2 返回。
但是,在执行后续的代码块过程中,如果遇到了新的 return
,那么之前的暂存结果就会被覆盖。如:
public static int getValue() {
int i = 1;
try {
i++;
return i;
} catch (Exception e) {
i = 66;
} finally {
i = 100;
return i;
}
}
以上代码方法得到的结果是100,是因为在finally
中遇到了一个新的 return
,就会把之前的结果给覆盖掉。
如果代码出现异常也同理:
public static int getValue() {
int i = 1;
try {
++i;
System.out.println( 1 / 0 );
return i;
} catch (Exception e) {
i = 66;
} finally {
i = 100;
return i;
}
}
在try中出现一个异常之后,会执行 catch
,在执行 finally
,最终得到 100。如果没有finally
:
public static int getValue() {
int i = 1;
try {
i++;
System.out.println( 1 / 0 );
return i;
} catch (Exception e) {
i = 66;
return i;
}
}
那么得到的结果将是66。
所以,如果 finally
块中有 return
语句,则其返回值将是整个 try-catch-finally
结构的返回值。如果 finally
块中没有 return
语句,则 try
或catch
块中的 return
语句 (取决于哪个执行了) 将确定最终的返回值。
注意:我在上面的示例代码中一会使用 ++i,一会使用 i++,这个我要给大家回顾一下,在编程中,对于这个变量自身来讲,前++
和 后 ++
是没有任何区别的。总结如下:
(1)对于变量自身来说,无论将++放在变量名的前面或者后面都是先数值的加1效果,实际上是等价的。
(2) a++ 表示先让 a 的数值作为整个表达式的结果,然后再让a自身的数值加1; ++a 表示先让a自身的数值加1,然后再作为整个表达式的结果。
final、finally、finalize有什么区别? 这个问题就像周杰、周杰伦和周星驰之间有啥关系的问题一样.其实没啥关系,放在一起比较无非是名字有点像罢了。
- final: 用于声明变量、方法或类,使之不可变、不可重写或不可继承
- finally: 是异常处理的一部分,用于确保代码块 (通常用于资源清理) 总是执行
- finalize: 是Obiect类的一个方法,用于在对象被垃圾回收前执行清理操作,但通常不推荐使用
final是一个关键字,可以用来修饰变量、方法和类。分别代表着不同的含义。
final变量: 即我们所说的常量,一旦被赋值后,就不能被修改。
final int x = 100:
// x = 200;// 编译错误,不能修改final变量的值
public static final string AUTHOR_NAME = "Xinbaobaba":
final方法: 不能被了类重写
public final void show() {
//.........
}
final类: 不能被继承
public final class MyFinalClass {
//......
}
finally是一个用于异常处理,它和try、catch块一起使用。无论是否捕获或处理异常,finally块中的代码总是执行(程序正常执行的情况) 。通常用于关闭资源,如输入/输出流、数据库连接等。
try {
//可能产生异常的代码
} catch (Exception e) {
// 异常处理代码
} finally {
// 清理代码,总是执行
}
finalize
是 Object
类的一个方法,用于垃圾收集过程中的资源回收。在对象被垃圾收集器回收之前 finalize
方法会被调用,用于执行清理操作(例如释放资源)。但是,不推荐依赖finalize方法进行资源清理,因为它的调用时机不确定且不可靠。
protected void finalize() throws Throwable {
// 在对象被回收时执行清理工作
}