Java try catch finally 总结

题记:

网上看了很多try catch finally 的例子,发现并没有一个总结的非常全的,将各种case都有写的,所以在这里总结下,不正确的还请指教!

问题1: finally 语句内一定会执行吗?

不一定会执行:如下两种情况

  1. finally 语句必须在try语句块执行的情况下才会执行。
  2. 如果有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,但是修改了要返回的值,会最终影响返回结果吗?

  1. 如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
  2. 如果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的各种题目。



猜你喜欢

转载自blog.csdn.net/u011563903/article/details/79940664