因为一道题,我把 try-catch-finally 的细节都整理了一遍(1500字)

简介: 原因:return i++; 在内部是可以分为三步,① int tmp = i; ② i += 1; ③ return tmp;

image.png


因为在做题的时候碰到了一道相关的题目


所以写篇本文总结下 try-catch-finally 相关的易错点


文章长 1500字 (很多都是代码,看的很快的)


如果还有其它的点,欢迎大家评论区留言


1. try 中某句如果出现异常,则该块中剩下的代码不会执行


public static void main(String[] args) {
    try {
        int i = 1 / 0;
        System.out.println("哈哈");
    } catch (ArithmeticException e) {
        throw new RuntimeException("throw了一个异常");
    } finally {
        System.out.println("finally");
    }
}

catch块/finally块 也同样如此


2. 多个catch块,先出现的catch块捕获的异常类型必须小于等于后面catch块中的异常


如果这样的话,后面的异常都会在前面catch中捕获,那后面的catch就没有意义了


public static void main(String[] args) {
    try {
        int i = 1 / 0;
    } catch (Exception e) {
        System.out.println("haha");
    } catch (ArithmeticException e) {
        System.out.println("嘿嘿");
    } finally {
        System.out.println("finally");
    }
}

image.png


3. try / catch 中有 return,finally也有return 最终生效的是 finally中的


public static void main(String[] args) {
    System.out.println(f());
}
public static String f() {
    try {
        return "try";
    } catch (ArithmeticException e) {
        return "catch";
    } finally {
        return "finally";
    }
}
//最终输出 finally


4. 如果catch中有return但finally中也有return,那么将返回finally中的,但catch中 return后面的内容如前置或后置++等操作是会执行生效的


原因:return i++; 在内部是可以分为三步,① int tmp = i; ② i += 1; ③ return tmp;


所以才会导致如下结果。


public static void main(String[] args) {
    System.out.println(f());
}
public static int f() {
    int i = 1;
    try {
        return i /= 0;
    } catch (ArithmeticException e) {
        return i++;
    } finally {
        return i;
    }
}


image.png


5. 如果catch中有return,而finally中没有return,那么将返回catch中的,就算finally中的代码对catch中的返回值进行了修改,catch返回的内容依旧是未执行finally块时的。


public static void main(String[] args) {
    System.out.println(f());
}
public static int f() {
    int i = 1;
    try {
        return i /= 0;
    } catch (ArithmeticException e) {
        return i;
    } finally {
        i++;
    }
}

image.png


顺便再提几个异常相关需要注意的点


1.throws抛出异常必须大于等于方法内产生的异常。


2.一个方法如果调用了一个抛出编译时异常的方法,那么必须处理。


3.throws后可以是多个异常,他们之间用 , 隔开


4.运行时异常未做处理,相当于默认throws处理。


4.子类重写父类方法时,抛出的异常要小于等于父类的。


5.注意在某方法内时抛出异常对象是用throw,而在方法声明中抛出异常类型是用throws

目录
相关文章
面试官: 请你手写一份 Call()源码,看完此篇不用担心!
面试官: 请你手写一份 Call()源码,看完此篇不用担心!
|
1月前
|
搜索推荐 大数据 数据处理
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
32 0
|
Java 测试技术 API
开发小技巧系列 - 如何避免NPE,去掉if...else(四)
利用optional来处理各种IF-ELSE的判断
99 0
一个try-catch问出这么多花样【面试题】
一个try-catch问出这么多花样【面试题】
91 0
一个try-catch问出这么多花样【面试题】
|
Web App开发 前端开发 JavaScript
重学前端 20 # try里面放return,finally还会执行吗?
重学前端 20 # try里面放return,finally还会执行吗?
128 0
重学前端 20 # try里面放return,finally还会执行吗?
|
Java 程序员 数据库
Java异常处理机制(完结篇)——再看不懂我找不到女朋友
Java异常处理机制(完结篇)——再看不懂我找不到女朋友
144 0
Java异常处理机制(完结篇)——再看不懂我找不到女朋友
try catch 应该放在for里还是不该放for里
try catch 应该放在for里还是不该放for里
100 0
|
Java
JDK打印的疑问:CUPSPrinter有何用处?
JDK打印的疑问:CUPSPrinter有何用处?
85 0
|
Java Unix 编译器
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(二)
final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。
152 0
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(二)
|
Java 编译器 程序员
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(一)
final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。
103 0
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(一)