java关于异常处理只使用try-finally而不使用catch

来源:互联网 发布:西班牙无敌舰队知乎 编辑:程序博客网 时间:2024/06/05 09:03

1. 前言:

通常我们在异常处理的时候一般就使用try-catch,

try {    // 需要处理的代码段} catch(Exception e) {    // 异常处理方法} 

更加好一些的处理方式为try-catch-finally,

try {    // 需要处理的代码段} catch(Exception e) {    // 异常处理方法} finally {    // 无论有无异常最后都要执行的代码段}

2.1 问题1:

2.1.1 如下代码可否执行?

public class Test {    public static void main(String[] args) {        System.out.println("return value of getValue():" +getValue());    }    public static int getValue() {        int i = 1;        try {            i = 4;        } finally {            i++;            return i;        }    }}

2.1.2 解析

以上代码主要问题在于没有使用catch,而直接使用的try-finally,那么到底可行不可行呢?答案是可以,以上代码运行出来的结果为:return value of getValue():5

2.1.3 疑惑

自然我们想想也能想通,这里没有异常出现,那么没有catch也不影响,那么问题来了…

2.2 问题2

如果在try代码块中抛出异常了呢?我们这里只用了try-finally,还是没有用到catch,那么还会有结果吗?

2.2.1 如下代码可否执行?

public class Test {    public static void main(String[] args) {        System.out.println("return value of getValue():" +getValue());    }    public static int getValue() {        int [] a = new int[1];        int i = 1;        try {            a[10] = 90;            i = 4/0;        } finally {            i++;            return i;        }    }}

2.2.2 解析

以上代码在try中出现了异常,按照常理会进入catch中获取异常,那么程序还会正常执行吗?会的,执行结果为return value of getValue():2 ,这里没有catch,那么没有就不执行catch,直接进入finally代码块中执行,程序正常执行。

3. 分析

严格的说法其实是:try只适合处理运行时异常,try-catch适合处理运行时异常+普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略,你加上catch编译器也觉得无可厚非。

阅读全文
1 0
原创粉丝点击