Java学习分享-try...catch...finally语句块使用详解

举报
发表于 2021/10/30 16:12:39 2021/10/30
【摘要】 在异常这一章节的学习中,对异常的捕获处理主要涉及三个关键字:try、catch、finally,那么在try-catch-finally语句块中这三个关键词分别起的是什么功能?是必须一起使用吗?可以单独使用吗?本文从一道在华为云课堂中的多选题入手,来一一解惑,一起学习~

在异常这一章节的学习中,对异常的捕获处理主要涉及三个关键字:try、catch、finally,写这篇博文的出发点是基于下面的这道多选题

说实话,本人在做的过程中,对于B,C,D选项是拿捏不定的,说明对于try-catch-finally语句块的使用还是理解不够,下面带着疑问先对try、catch、finally三个关键词做进一步的认识,后面对上面的选项逐个验证。如有不对之处,欢迎指正~

一、try、catch、finally三个关键词的含义

try

try用于监听可能会抛出异常的代码,将要被监听的代码放在try语句块之内。

catch

用于捕获try语句块中发生的异常,catch()后面的()中传入异常参数,表明该catch语句块中要处理的异常类型,catch块不能单独使用,必须始终和try块在一起使用。

1、catch后面的()中的异常类型可以是和try中可能抛出异常的代码块相匹配的具体的异常类型,也可以是该异常的父类型(多态)

2、如果有多个异常,也可以在try后面跟多个catch语句块对各个异常分别进行捕获处理

说明:当try的监控语句出现异常后,会直接从导致异常的代码处跳出,JVM会从和try匹配的catch语句块中按顺序寻找匹配的异常类型,如果找到,直接进入到相应的catch语句块,剩下的catch块不再执行。

所以要注意的是,子类型的异常要放在父类型的异常前面,否则后面的捕获子类型的异常的catch语句块因为永远执行不到会报错!

finally

finally语句块为异常处理提供了一个统一的出口,异常机制保证了无论try中的监听语句是否抛出异常,finally中的代码总是会被执行。因此可以将那些在任何情况下都要被执行的代码放在finally中,主要用于回收在try语句块中打开的资源,比如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。

问:不管有没有出现异常,finally块中代码都会执行吗?

1)无异常的情况下:

2)有异常的情况下:

所以,不管try语句块中的代码是否发生异常,finally语句块都会执行的

问:try中有return语句时,return和finally哪个先执行?

判断:demo()最终返回的i值是多少?

public class Demo1 {
	public static void main(String[] args) {
		System.out.println(demo());
	}
	public static int demo() {
		int i=100;
		try {
			return i/2;
		}finally {
			i++;
			System.out.println("finally子句");
		}
	}
}

运行结果:

可以看到finllay子句也执行了,但是最终i的值是50,并不是101或者51,为什么呢?

分析:Java中有两条规则不可破坏:

  • 方法体中的代码必须遵循自上而下顺序逐行执行
  • return语句一旦执行,整个方法体结束

上面的执行结果正是遵循了以上两条规则的结果。finally子句是在return后面的表达式i/2运算完之后执行的,此时并没有立即给调用者返回运算后的值,而是先把要返回的值保存起来,继续执行finally中的代码,不管finally中对要返回的值涉及的变量如何影响,最后返回的都是在执行finally之前保存的值。执行完finally里面的代码后,return返回之前保存的值,方法体结束。这样既保证了代码自上而下的执行顺序,又能保证finally被执行到,return语句用来终止方法体。

二、try-catch-finally三个关键词的组合使用

一问:try可以单独使用吗?

答案是:显然不可以,编译器提示语法错误,需要插入finally来完成try声明语句块。

添加finally语句块之后,编译通过

所以上面的B选项是正确的,一个try语句块中可以不使用catch语句,try-finally也可以联合使用

注意:此处并没有对异常进行catch捕获,代码虽然编译通过,但在运行时会抛出异常

二问:finally可以单独使用吗?

答案是:finally不可以单独使用,必须和try语句块一起出现。所以上面的D选项是错误的,finally块不可以单独使用,必须和try块在一起

三反问:try必须和finally一起使用吗?

这个答案显而易见,try不能单独使用,至少必须和catch或fianlly之一联合使用。finally也不能单独使用,但必须和try联合使用

四问:catch可以单独使用吗?

这个答案也是显而易见的,catch语句块就是为了捕获异常的,不能单独使用,必须和try语句块始终在一起,用来捕获try中监听代码可能出现的异常。所以上面的C选项是正确的

现在再回头看一下前面的多选题,答案清晰了许多~

总结:在try...catch...finally语句块中

  • try不能单独使用,要么try-catch-finally,要么try-catch,要么try-finally

  • catch不能单独使用,必须和try联合使用,一个try可以有多个catch

  • finally不能单独使用,必须和try联合使用

上面就是本人对try-catch-finally语句块的理解,可能比较啰嗦,但个人认为只有一一解决疑虑之后,才可以印象深刻。如有理解不当之处,欢迎指正~

注:本文是在学习完华为云课堂的异常章节课程和参考网上优秀博文之后,再结合个人理解写的,此处表示感谢!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。