本文主要是介绍Java try catch finally 总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题记:
网上看了很多try catch finally 的例子,发现并没有一个总结的非常全的,将各种case都有写的,所以在这里总结下,不正确的还请指教!
问题1: finally 语句内一定会执行吗?
不一定会执行:如下两种情况
- finally 语句必须在try语句块执行的情况下才会执行。
- 如果有System.exit()语句,终止了JVM,则不会执行。举例:
public int testCas1() {int i = 1;if (i == 1) {return 0;}try {System.out.println("try block");// 不会执行return i;} finally {System.out.println("finally block");}}
返回结果:0,finally 中内容不会打印。
问题2: finally 语句如果有return,会影响return结果吗?
会影响,会return成finally 中要return的结果
public int test() {int i = 1;try {System.out.println("try block " + i);i = i / 0;return i;} catch (Exception e) {System.out.println("catch block");i = i +1;return i;}finally {i = i + 1;System.out.println("finally block");return i;}}
test 结果如下,分析:即使出现exception 也会执行到finally.
try block 1
catch block
finally block
return value of test(): 3
问题3: finally 语句没有return,但是修改了要返回的值,会最终影响返回结果吗?
- 如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
- 如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
public int test() {int i = 1;try {System.out.println("try block " + i);i = i / 0;return i;} catch (Exception e) {System.out.println("catch block");i = i +1;return i;}finally {i = i + 1;System.out.println("finally block");}}
结果, return 是2 不是3
try block 1
catch block
finally block
return value of test(): 2
引用类型:
public static Person test() {Person result = new Person();try {result.age = 30;return result;} finally {result.age = 50;}}public static class Person{public static int age;}
结果:Person.age = 50;
如果没有异常出现,而且finally语句中没有return,则会执行try里边的return,并且,会将变量暂存起来(对象存的是引用的地址),再去执行finally中的语句,这时候,如果返回值是基本数据类型或者字符串,则finally相当于更改副本,不会对暂存值有影响;但是,如果返回值是对象,则finally中的语句,仍会根据地址的副本,改变原对象的值。所以上边的例子,返回值的age为50。
相信通过以上3个问题,应该比较能驾驭对finally的各种题目。
这篇关于Java try catch finally 总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!