Java finally用法详解(附带实例)
Java 语言提供了异常捕获的处理机制,可以帮助我们处理由异常引发的问题。一般情况下,异常捕获使用 try-catch 语句,但实际上一个完整的异常处理语句由 3 部分组成,即 try 语句块、catch 语句块和 finally 语句块,结构如下:
在实际开发中,finally 语句块用于关闭文件或释放其他系统资源。当然,也有一些例外情况,就是在 try-catch 语句块中执行 System.exit(0) 语句,表示退出当前的 Java 虚拟机,Java 虚拟机停止,程序中的任何代码都不会再执行。
接下来,通过案例来演示 finally 语句块的使用:
由此我们不难看出,不管程序是否发生异常,也不论在 try 和 catch 语句块中是否使用 return 语句结束,finally 语句块都会被执行。
另外,finally 是在 return 后面的表达式运算完成之后才执行的,此时并没有直接返回运算值,而是先将返回值保存(假设保存在了内存 A 中),finally 中的代码的执行不会影响方法的返回值,仍是在 finally 执行之前内存 A 中的值,因此方法返回值是在 finally 执行之前就已经确定的。
接下来,通过案例对上述情况进一步说明:
接下来,我们在 try 和 finally 语句块中加 return 语句进行测试:
	
	
try {
    可能会产生异常的程序代码
}catch (异常类型 e) {
    发生异常后处理的程序代码1
}catch (异常类型 e) {
    发生异常后处理的程序代码2
} … catch (异常类型 e) {
    发生异常后处理的程序代码n
}
finally {
    最终执行的程序代码
}
从语法上来讲,当异常处理机制结构中出现 catch 语句块时 finally 语句块是可选的,当包含 finally 语句块时 catch 语句块是可选的,二者可以同时存在,也可以只存在其一。与 catch 语句块可以出现多次不同,finally 语句块只能出现一次。finally用来做什么
finally 是最终执行的语句块,无论 try-catch 语句块中是否发生异常,finally 语句块中的代码都会被执行。也就是说,当希望程序中的某些语句无论程序是否发生异常都执行时,可以将这些语句打包成 finally 语句块。在实际开发中,finally 语句块用于关闭文件或释放其他系统资源。当然,也有一些例外情况,就是在 try-catch 语句块中执行 System.exit(0) 语句,表示退出当前的 Java 虚拟机,Java 虚拟机停止,程序中的任何代码都不会再执行。
接下来,通过案例来演示 finally 语句块的使用:
public class Demo {
    public static void main(String[] args) {
        try {
            final int result = divide(5, 0); // 调用divide()方法
            System.out.println(result); // 打印结果
        } catch (ArithmeticException e) {
            System.out.println("捕获到了异常:" + e);
            return;
        } finally {
            System.out.println("开始执行finally块");
        }
        System.out.println("异常捕获结束");
    }
    // 下面的方法实现了两个整数相除
    public static int divide(int x, int y) {
        int result = x / y; // 定义一个变量result,记录两个数相除的结果
        return result; // 将结果返回
    }
}
程序的运行结果如下:
	捕获到了异常:java.lang.ArithmeticException: / by zero
	开始执行finally块
由此我们不难看出,不管程序是否发生异常,也不论在 try 和 catch 语句块中是否使用 return 语句结束,finally 语句块都会被执行。
另外,finally 是在 return 后面的表达式运算完成之后才执行的,此时并没有直接返回运算值,而是先将返回值保存(假设保存在了内存 A 中),finally 中的代码的执行不会影响方法的返回值,仍是在 finally 执行之前内存 A 中的值,因此方法返回值是在 finally 执行之前就已经确定的。
接下来,通过案例对上述情况进一步说明:
public class Demo {
    public static int testReturn() { // 定义变量x
        int x = 1; // 定义变量x
        try {
            ++x; // ++在前时先运算
            return x; // 返回结果
        } finally {
            ++x; // ++在前时先运算
            System.out.println("finally: " + x); // 打印在finally中的结果
        }
    }
    public static void main(String[] args) {
        System.out.println("最终返回值: " + testReturn());
    }
}
程序的运行结果如下:
	finally:3
	最终返回值:2
在finally中使用return
在 finally 中最好不要使用 return 语句,否则程序会提前退出,返回值不是 try 或 catch 语句块中保存的返回值。接下来,我们在 try 和 finally 语句块中加 return 语句进行测试:
public class Demo {
    public static String testReturn() {
        try {
            return "我是try中的return";
        } finally {
            return "我是finally中的return";
        }
    }
    public static void main(String[] args) {
        System.out.println("返回结果:" + testReturn());
    }
}
程序的运行结果如下:
返回结果:我是finally中的return
程序最终输出的是 finally 中的 return 语句,而并不是 try 中的 return 语句,所以在 finally 中最好不要使用 return 语句。 
	 ICP备案:
 ICP备案: 公安联网备案:
 公安联网备案: