首页 > 编程知识 正文

finally语句块中的代码,finally语句什么时候执行

时间:2023-05-04 00:47:41 阅读:114738 作者:3004

文章目录1.return语句的执行顺序1.1finally语句是指return语句执行后, 在返回return语句之前执行的2 .重写问题2.1finally块的return语句重写try块如果return返回的2.1finally语句不重写返回值,则在中,原始返回值为finally 也可能不会改变3 .异常情况3.1try块的return语句异常情况下不执行如果3.2try发生异常,return是否一定会执行catch语句中写入的4.finally语句?

1.return语句的执行顺序1.1finally语句返回return语句执行后return语句上一次执行的package exception; public class demo 06 (publicstaticvoidmain (string [ ] args ) system.out.println ) func (); }公共静态int func (() { int a=10; try{system.out.println('try中的代码块); 返回数a=10; }catch(exceptione ) system.out.println ) (catch的代码块); } finally { system.out.println (finally的代码块); if(a10 ) system.out.println('a10,' a=' a ); } }返回a=50; }

执行结果:

try的代码块finally的代码块a 10,a=2020注意:

a 10,a=20的结果表明,return a =10已经在执行,但不直接返回,而是在执行finally语句的内容后返回结果

2 .覆盖问题2.1finally块的返回语句覆盖try块的返回并返回包执行; 公共类演示07 { publicstaticvoidmain (string [ ] args ) system.out.println ) func (); }公共静态int func (() { int a=10; try{system.out.println('try中的代码块); 返回数a=10; }catch(exceptione ) system.out.println ) (catch的代码块); } finally { system.out.println (finally的代码块); if(a10 ) system.out.println('a10,' a=' a ); }返回100; }}运行结果:

try的代码块finally的代码块a10,a=20100注意:

)1) try中有return语句,finally中也有return语句,最终执行的是finally的return语句

)2)如果在finally代码块中写入了return语句,则finally之后的return语句将变为不可达语句,必须将其注释掉。 否则就无法编译

2.2如果return语句未复盖finally语句中的返回值,则原始返回值可能会因finally中的修改而改变,也可能不会改变。 (1)测试1

打包执行; public class demo 08 (publicstaticvoidmain (string [ ] args ) system.out.println ) func (); }公共静态int func (() { int a=10; try{system.out.println('try中的代码块); 返回数a=20; }catch(exceptione ) { e.printStackTrace ); system.out.println(catch的代码块); } finally { system.out.println (finally的代码块); a =20

; if(a > 10){ System.out.println("a > 10,a="+a); } a += 20; } return 200; }}

运行结果:

try中的代码块finally中的代码块a > 10,a=5030

注意:

对于基本数据类型来说,finally中对返回值的修改不会影响try中的返回变量的值

(2)测试2

package exception;import java.util.HashMap;import java.util.Map;public class Demo09 { public static void main(String[] args) { System.out.println(getMap().get("KEY").toString()); } public static Map<String,String> getMap(){ Map<String,String> map = new HashMap<>(); map.put("KEY","INIT"); try{ map.put("KEY","try"); return map; }catch (Exception e){ e.printStackTrace(); map.put("KEY","catch"); }finally { map.put("KEY","finally"); map = null; } return map; }}

运行结果:

finally

注意:

对于引用数据类型来说,finally中对返回值的修改会影响try中的返回变量的值

3.异常情况 3.1try块中的return语句在异常的情况下不会被执行 package exception;public class Demo10 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代码块"); a = a/0; return a += 50; }catch (Exception e){ a += 15; System.out.println("catch中的代码块"); }finally { System.out.println("finally中的代码块"); if(a > 20){ System.out.println("a > 20,a ="+a); } a += 10; } return a; }}

运行结果:

try中的代码块catch中的代码块finally中的代码块a > 20,a =2535

注意:

try语句块中发生异常,try语句异常后的内容不会执行,return语句也不会执行,执行的是捕获到的catch语句块和finally语句块

3.2try中发生异常时,return写在catch语句中 package exception;public class Demo11 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代码块"); a = a /0; return a += 10; }catch (Exception e){ System.out.println("catch中的代码块"); return a += 15; }finally { System.out.println("finally中的代码块"); if (a > 10){ System.out.println("a > 10, a = "+a); } a += 50; System.out.println(a); } }}

运行结果:

try中的代码块catch中的代码块finally中的代码块a > 10, a = 257525

注意:

try中发生异常之后,catch中的return语句先执行,确定了返回值之后(保存起来,finally中的语句对返回值无影响)再去finally语句块,执行完之后再返回a的值,finally中对a的修改对返回值无效

4.finally语句一定会被执行吗?

(1)当程序进入try语句之前就出现异常时,会直接结束
(2)try语句块中有强制退出时也不会执行finally语句块中的代码

System.exit(0);

代码示例:

package exception;public class Demo12 { public static void main(String[] args) { int a = 10; try{ System.out.println("try block"); System.exit(0); }catch (Exception e){ System.out.println("catch block"); }finally { System.out.println("finally block"); } }}

运行结果:

try block

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。