Java编程中异常处理 try-catch-finally语句的一些分析

本文是我的学习笔记,若有错误,欢迎在评论区留言。

目录

实例1

实例2

实例3

实例4

实例5

总结


实例1

话不多说,直接上代码:

public class TestFinally {
	
	public static float test1(int n) {
		try {
			n = 100/n;
			return n;
		} finally {
			System.out.println("方法内部finally语句执行了!");
		}
	}
	
	public static void main(String[] args) {
		System.out.println(test1(1));
	}
	
}

运行结果:

方法内部finally语句执行了!
100.0

我们可以看到,如果try里面有return,并成功return了东西。则会先运行finally里的语句再去return。

 

实例2

但是我们需要注意的是,如果我们是完整的 try-catch-finally 语句,因为try和catch语句都是有可能会被执行的,所以catch语句中需要有return。否则IDE会报错。

public class TestFinally2 {
	
	public static float test1(int n) {
		try {
			n = 100/n;
			return n;
		} catch (Exception e) {
			System.out.println("方法内部catch语句执行了!");
			return n;
		} finally {
			System.out.println("方法内部finally语句执行了!");
		}
	}
	
	public static void main(String[] args) {
		System.out.println(test1(1));
	}
	
}

运行结果:

方法内部finally语句执行了!
100.0

 

实例3

而我们用 TestFinally2的代码,在main里执行新的语句:

System.out.println(test1(0));

运行结果:

方法内部catch语句执行了!
方法内部finally语句执行了!
0.0

由此可见,当test1 这个方法中出现异常时会直接跳转到执行 catch里的语句(当然得满足Catch参数的异常)。同时,也会执行finally语句。但是我们发现return是在 try-catch-finally 运行完毕之后才执行的(这句话我说得不太清楚,以后随着学习深入,会用更专业的术语更正)

 

实例4

我们再来看这个实例


public class TestFinally3 {
	
	public static float test1(int n) {
		try {
			n = 100/n;
			return n;
		} catch (Exception e) {
			System.out.println("方法内部catch语句执行了!");
			return n+1;
		} finally {
			System.out.println("方法内部finally语句执行了!");
			return n+2;
		}
	}
	
	public static void main(String[] args) {
		System.out.println(test1(0));
	}
	
}

输出结果:

方法内部catch语句执行了!
方法内部finally语句执行了!
2.0

其实我们可以看出来,虽然执行了catch语句,但是catch语句里的return是没有被执行的。反倒是,最后执行的是finally语句的return。(这边底层的原理我不清楚,如果有哪位大神能解释一下就好了,非常感谢)但需要注意的是,这样的写法IDE会有提示(应该是不规范)

 

实例5


public class TestFinally4 {
	
	public static float test1(int n) {
		try {
			n = 100/n;
		} finally {
			System.out.println("方法内部finally语句执行了!");
		}
		return n;
	}
	
	public static void main(String[] args) {
		System.out.println(test1(0));
	}
	
}

输出结果:

方法内部finally语句执行了!
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at TestFinally4.test1(TestFinally4.java:6)
	at TestFinally4.main(TestFinally4.java:14)

对于这个实例的结果我表示非常奇怪,这里做个标记!

 

注意!我们不能在finally里有return,同时在 try-catch-finally 语句之后还有return。IDE会报错!

 

总结

Java处理异常 try-catch-finally 的一个顺序:

  1. 先看try里面有没有异常。如果有异常,则进入2。若无异常,进入finally。finally语句里面的return优先级是大于catch和try的。意思是说,即使try和catch中有return,但如果finally也有return。则最终会使用finally中的return。
  2. 当try里面有异常,会进入到catch语句。但如果是一个有返回值的方法,我们需要注意(详见实例2)
  3. 无论如何,finally里的语句都会被执行!

我们不能在finally里有return,同时在 try-catch-finally 语句之后还有return。

 

参考文章:

https://blog.csdn.net/qq_35584878/article/details/101275980 (在总结的基础上增添了代码实例,以及我自己的总结)

https://blog.csdn.net/mxd446814583/article/details/80355572 (未引用,将来可能补充引用)

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值