因为一道题,我把 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

目录
相关文章
|
JavaScript 测试技术 Linux
|
11月前
|
边缘计算 分布式计算 资源调度
云计算与边缘计算的融合趋势与挑战
云计算与边缘计算的融合趋势与挑战
293 3
|
8月前
|
算法 搜索推荐 Windows
审稿人直呼简洁,单点PageRank终极版!人大STOC论文让复杂度优化至理论最优
人民大学研究团队在STOC发表论文《Revisiting Local Computation of PageRank: Simple and Optimal》,提出一种局部计算PageRank的新算法,显著降低计算复杂度。该算法仅关注目标节点及其周围节点,避免遍历全网,提升大规模网络处理效率。研究改进了ApproxContributions算法的时间复杂度,并通过简洁的分析方法证明其最优性,解决了长期存在的开放问题。论文还优化了PageRank中心性的计算复杂度,为信息检索和网络分析提供新思路。然而,结果可能受限于特定网络模型,实际应用效果需进一步验证。
122 7
|
12月前
|
机器学习/深度学习 算法 数据处理
模型预测笔记(二):结合SMOTE来进行数据不均衡处理实操
这篇文章介绍了SMOTE算法,这是一种通过合成新样本来处理数据不均衡问题的技术,旨在提高模型对少数类别的识别能力。
585 1
|
10月前
|
设计模式 缓存 监控
Python中的装饰器模式及其高级应用####
本文探讨了Python中装饰器模式的基本原理、实现方式以及其在代码优化和功能扩展中的应用。通过具体示例,展示了如何利用装饰器简化代码结构、增强代码可读性及维护性,并进一步探讨了装饰器在日志记录、性能监控等高级场景下的实战应用。 ####
|
12月前
|
监控 Java
G1垃圾回收器的哪些配置参数对性能影响最大,如何调整这些参数
G1垃圾回收器的哪些配置参数对性能影响最大,如何调整这些参数
699 0
|
存储 Linux
在Linux中,如何挂载和卸载文件系统?
在Linux中,如何挂载和卸载文件系统?
单元格内容的对齐方式
单元格内容的对齐方式
66 1
|
缓存 应用服务中间件 nginx
Nginx 学习笔记(三)proxy_cache 缓存配置和ngx_cache_purge模块
反向代理的缓存清理 一、proxy_cache配置 (1)如何配置和安装,都在这里了:https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.
3090 0
Nginx 学习笔记(三)proxy_cache 缓存配置和ngx_cache_purge模块
|
存储 Java
数据结构之第七章、队列(Queue)
队列具有先进先出FIFO(FirstIn First Out):进行的一端称为:进行的一端称为。
276 0