Java编程中异常处理 try-catch-finally语句的一些分析
本文是我的学习笔记,若有错误,欢迎在评论区留言。
目录
实例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 的一个顺序:
- 先看try里面有没有异常。如果有异常,则进入2。若无异常,进入finally。finally语句里面的return优先级是大于catch和try的。意思是说,即使try和catch中有return,但如果finally也有return。则最终会使用finally中的return。
- 当try里面有异常,会进入到catch语句。但如果是一个有返回值的方法,我们需要注意(详见实例2)
- 无论如何,finally里的语句都会被执行!
我们不能在finally里有return,同时在 try-catch-finally 语句之后还有return。
参考文章:
https://blog.csdn.net/qq_35584878/article/details/101275980 (在总结的基础上增添了代码实例,以及我自己的总结)
https://blog.csdn.net/mxd446814583/article/details/80355572 (未引用,将来可能补充引用)
本文地址:https://blog.csdn.net/qq_35939846/article/details/109818223
上一篇: 简说设计模式——装饰模式