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

Posted Gun0.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了try-catch-finallyjava异常捕获的三种格式以及finally和return的执行顺序相关的知识,希望对你有一定的参考价值。

java异常捕获的三种格式

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都会执行。
有的时候,系统的架构就是需要上抛异常,无需自己处理
所以tryfinally就可以了,不用加catch。

以上是关于try-catch-finallyjava异常捕获的三种格式以及finally和return的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

python常见异常和异常捕获

Android 捕获全局异常CrashHandler,防止异常闪退,记录异常日志

java 主键异常怎么捕获

前端异常类型及捕获方式

lua中怎么捕获错误异常信息

java捕获到异常后,异常后的语句不会被执行