try、catch、finally用法总结
try、catch、finally用法总结:
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
执行顺序
1.
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test()); 4 } 5 public static int test(){ 6 int i = 1; 7 try{ 8 i++; 9 System.out.println("try block, i = "+i); 10 }catch(Exception e){ 11 i ++; 12 System.out.println("catch block i = "+i); 13 }finally{ 14 i = 10; 15 System.out.println("finally block i = "+i); 16 } 17 return i; 18 }
结果输出如下:
try block, i = 2
finally block i = 10
10
先执行try块,并没有捕获到异常,finally 块,最后return。
2.当我们把return放到try块中和catch块中,会怎么样呢?你们会不会纠结先return呢还是先finally呢?返回值i会改变吗?
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test()); 4 } 5 public static int test(){ 6 int i = 1; 7 try{ 8 i++; 9 System.out.println("try block, i = "+i); 10 return i; 11 }catch(Exception e){ 12 i ++; 13 System.out.println("catch block i = "+i); 14 return i; 15 }finally{ 16 i = 10; 17 System.out.println("finally block i = "+i); 18 } 19 }
结果输出如下:
try block, i = 2
finally block i = 10
2
如我们总结一样:
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
3.如果是操作不是基本类型会怎么样?会不一样吗?为什么?
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test().mmp("fuck")); 4 } 5 public static Person test(){ 6 Person person = new Person(); 7 try{ 8 person.setShengao("172cm"+"---try block"); 9 System.out.println("try block"); 10 return person; 11 }catch(Exception e){ 12 person.setTizhong("100kg"); 13 System.out.println("catch block"); 14 return person; 15 }finally{ 16 person.setXingbie("女"); 17 System.out.println("finally block "); 18 } 19 }
Person类
1 package xyz; 2 3 public class Person { 4 public String shengao; 5 public String tizhong; 6 public String xingbie; 7 8 //public String hello(String input); 9 10 public String getShengao() { 11 return shengao; 12 } 13 14 public void setShengao(String shengao) { 15 this.shengao = shengao; 16 } 17 18 public String getTizhong() { 19 return tizhong; 20 } 21 22 public void setTizhong(String tizhong) { 23 this.tizhong = tizhong; 24 } 25 26 public String getXingbie() { 27 return xingbie; 28 } 29 30 public void setXingbie(String xingbie) { 31 this.xingbie = xingbie; 32 } 33 34 35 public String mmp(String fuck){ 36 System.out.println("person : mmp"); 37 System.out.println("shengao:"+this.shengao); 38 System.out.println("tizhong:"+this.tizhong); 39 System.out.println("xingbie:"+this.xingbie); 40 return fuck; 41 } 42 43 }
结果输出如下:
try block
finally block
person : mmp
shengao:172cm---try block
tizhong:null
xingbie:女
fuck
从上面可以看出,在finally中的set的性别 女 生效了,而在之前用基本类型,在finally中修改它的值不生效。为什么呢?
我们知道基本类型在栈中存储,而对于非基本类型是存储在堆中的,返回的是堆中的地址,因此内容被改变了。
4.如果在finally加入return,会怎么样? 如果在finally 抛出了异常呢?
在finally中存在return,会有黄色警告:finally block does not complete normally 意思是finally代码块不能正常完成。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~