【try-catch-finally】java异常捕获的三种格式以及finally和return的执行顺序

try-catch-finally

格式

 try {
			//可能会发生异常的代码
			
		} catch (Exception/*异常类名*/ e/*变量名*/) {
			// 异常的处理方案
		}finally {
			//常用于资源的释放
			//eg.数据库连接,文件流等
		}

finally的作用,特性和执行流程

①作用:Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。所以为了确保一定能回收 try 块中打开的物理资源,异常处理机制提供了 finally 代码块,并且 Java 7 之后提供了自动资源管理(Automatic Resource Management)技术。

②特性和执行流程
除非在 try 块、catch 块中调用了退出虚拟机的方法System.exit(int status),否则不管在 try 块或者 catch 块中执行怎样的代码,出现怎样的情况,异常处理的 finally 块总会执行。
a.如果没有异常发生,则finally在try内代码执行之后执行
在这里插入图片描述
在这里插入图片描述
try 代码块中没有拋出异常,则执行完 try 代码块之后直接执行 finally 代码块,然后执行 try catch finally 语句块之后的语句。

b.如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
在这里插入图片描述
在这里插入图片描述
try 代码块在第七行发生异常拋并被 catch 捕捉,在拋出异常的地方终止 try 代码块的执行(try内代码块7行以后的代码都不会执行了),转而执行相匹配的 catch 代码块,之后执行 finally 代码块。如果 finally 代码块中没有拋出异常,则继续执行 try catch finally 语句块之后的语句;如果 finally 代码块中拋出异常,则把该异常传递给该方法的调用者。

若try或catch或finally里有return语句

通常情况下不在 finally 代码块中使用 return 或 throw 等导致方法终止的语句,否则将会导致 try 和 catch 代码块中的 return 和 throw 语句失效。

try中有return语句

a.如果在try语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值
在这里插入图片描述
在执行到try内的return num;语句前,会先将返回值num保存在一个临时变量中,然后才执行finally语句,最后try的return返回的是那个临时变量,finally中对num的修改不会被返回。

catch中有return语句

b.如果在catch语句内有return语句,则return语句在finally语句执行结束后才执行,但finally并不能改变返回值
在这里插入图片描述
和try同理

finally中有retrun语句

①如果finally里面有return语句,try和catch内的return会丢失,实际会返回finally中的返回值。
在这里插入图片描述
②finally中有return不仅会覆盖try和catch内的返回值,还会掩盖try和catch内的异常,就像异常没有发生一样。
在这里插入图片描述
10/0会触发ArithmeticException,但是finally中有return语句,这个方法就会返回2,而不再向上传递异常了。

③ finally中不仅return语句会掩盖异常,如果finally中抛出了异常,则原异常就会被掩盖。
在这里插入图片描述

try-catch

格式

try {
				//发生问题的代码
			} catch(异常类名 变量名) {
				//异常处理方案
			}

执行流程

try里有多个异常

在这里插入图片描述
15行发生异常(NullPointerException),但是与catch里的异常类型不匹配,所以不会进catch而是整个程序强制停止(后面的代码全都不再执行),控制台的异常信息是jvm打印的。

在这里插入图片描述
虽然11行(日期格式不匹配)和15行(空指针异常)都发生异常,但是在11行发生异常后就会跳到catch去匹配到ParseException,而try一旦跳过就不会再返回去执行了。所以后面的那个空指针异常不会被执行,也就不会被捕获。

在这里插入图片描述
上面的异常不能下面异常的父类,不然下面的异常永远不会捕获到任何东西。

异常的体系结构

try-finally

格式

try {
				//发生问题的代码
			} finally {
				//资源的释放
			}

作用

try的后面必须接catch或finally或者都接,但不能一个都不接
不要catch{},只是异常会向上抛出而已,加了catch就是自己在处理异常了,无论出不出异常,finally都会执行。
有的时候,系统的架构就是需要上抛异常,无需自己处理
所以try{}finally{}就可以了,不用加catch{}。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值