当前位置: 首页 > news >正文

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

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

所以写篇本文总结下 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");
    }
}

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;
    }
}

 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++;
    }
}

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

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

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

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

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

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

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

 

相关文章:

  • 32、学习 Java 中的注解(参照官方教程)
  • 【第一部分 | HTML】1:揭露HTML的神秘面纱
  • 安装finalshell
  • 怎么找到贵人?
  • pix2pix-论文阅读笔记
  • Idea中重构从精通到陌生
  • springcloud
  • 【机器学习】树模型决策的可解释性与微调(Python)
  • SHRM在中国的认可度如何?这里说了实话
  • 单片机控制发光二极管的显示(1)
  • UNIX环境高级编程-第六章-系统数据文件和信息
  • 【初学者入门C语言】之习题篇(二)
  • [架构之路-14]:目标系统 - 硬件平台 - CPU、MPU、NPU、GPU、MCU、DSP、FPGA、SOC的区别
  • Linux下brk、sbrk实现一个简易版本的malloc
  • 一、CSS选择器与权重[基础选择器、结构选择器、属性选择器、伪类选择器]
  • 【comparator, comparable】小总结
  • angular学习第一篇-----环境搭建
  • crontab执行失败的多种原因
  • eclipse的离线汉化
  • Effective Java 笔记(一)
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript 基础知识 - 入门篇(一)
  • PHP 的 SAPI 是个什么东西
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React as a UI Runtime(五、列表)
  • use Google search engine
  • vue自定义指令实现v-tap插件
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 分享一份非常强势的Android面试题
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 组复制官方翻译九、Group Replication Technical Details
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $.ajax()
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (LeetCode 49)Anagrams
  • (MATLAB)第五章-矩阵运算
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)WCF的Binding模型
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (过滤器)Filter和(监听器)listener
  • (力扣)1314.矩阵区域和
  • (四)linux文件内容查看
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Linq学习笔记
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .“空心村”成因分析及解决对策122344
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 的程序集加载上下文
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • @GlobalLock注解作用与原理解析