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

一文讲解Java中的异常处理机制

Java中的异常处理机制用于处理程序运行过程中可能发生的各种异常情况,通常通过try-catch-finally语句和throw关键字来实现
在这里插入图片描述

  • Throwable是Java语言中所有错误和异常的父类。它有两个主要的子类:Error和Exception;
  • Error类代表那些严重的错误,这类错误通常是程序没法处理的,比如OutOfMemory内存不足,StackOverflowError栈溢出。这些错误通常都和JVM的运行状态有关,一旦发生,应用程序通常就没法恢复;
  • Exception类代表可以处理的异常,它分为两大类:编译时异常Checked Exception 和运行时异常Runtime Exception;
    1. 编译时异常,这类异常在编译时必须被显式处理,捕获或者声明抛出,常见的有IOException、SQLexception等;
    2. 运行时异常。这类异常在运行时抛出,它们都是RuntimeException的子类。对于运行时异常,Java编译器不要求必须处理它们;运行时异常通常是由程序逻辑错误导致的,比如NullPointerException、IndexOutOfBoundsException 等。

问一个问题,catch和finally的异常可以同时抛出吗?

  • 如果catch块抛出一个异常,而finally块中也抛出异常,那么最终抛出的异常将是finally块中的异常。catch块中的异常会被丢弃,而finally块中的异常会覆盖并向上传递;

    public class Example {
        public static void main(String[] args) {
            try {
                throw new Exception("Exception in try");
            } catch (Exception e) {
                throw new RuntimeException("Exception in catch");
            } finally {
                throw new IllegalArgumentException("Exception in finally");
            }
        }
    }
    
    • try 块首先抛出一个 Exception。
    • 控制流进入 catch 块,catch 块中又抛出了一个 RuntimeException。
    • 但是在 finally 块中,抛出了一个 IllegalArgumentException,最终程序抛出的异常是 finally 块中的 IllegalArgumentException。

    虽然 catch 和 finally 中的异常不能同时抛出,但可以手动捕获 finally 块中的异常,并将 catch 块中的异常保留下来,避免被覆盖。常见的做法是使用一个变量临时存储 catch 中的异常,然后在 finally 中处理该异常:

    public class Example {
        public static void main(String[] args) {
            Exception catchException = null;
            try {
                throw new Exception("Exception in try");
            } catch (Exception e) {
                catchException = e;
                throw new RuntimeException("Exception in catch");
            } finally {
                try {
                    throw new IllegalArgumentException("Exception in finally");
                } catch (IllegalArgumentException e) {
                    if (catchException != null) {
                        System.out.println("Catch exception: " + catchException.getMessage());
                    }
                    System.out.println("Finally exception: " + e.getMessage());
                }
            }
        }
    }
    

http://www.kler.cn/a/526287.html

相关文章:

  • 【自学笔记】计算机网络的重点知识点-持续更新
  • Vue3 结合 .NetCore WebApi 前后端分离跨域请求简易实例
  • 【后端】Flask
  • Git进阶之旅:Git 配置信息 Config
  • 【每日一A】2015NOIP真题 (二分+贪心) python
  • 【MySQL】初始MySQL、库与表的操作
  • 变量和简单数据类型(字符串)
  • doris:导入时实现数据转换
  • Java 分布式与微服务架构:现代企业应用开发的新范式
  • JAVASE入门十二脚-IO流charArrayReader,bufferedReader,输入与输出,采集百度网页,分块操作
  • Golang 并发机制-1:Golang并发特性概述
  • 实战:如何快速让新网站被百度收录?
  • 11 Spark面试真题
  • Redis常用命令合集【一】
  • 春节旅游高峰,人力资源如何巧妙应对?‌
  • Python标准库 - os (3) 调度策略、系统信息
  • 数据结构--数组链表
  • 大模型时代下的具身智能
  • 实验五---控制系统的稳定性分析---自动控制原理实验课
  • LabVIEW温度修正部件测试系统
  • 图漾相机——C++语言属性设置
  • Java 知识速记:全面解析 final 关键字
  • Linux《基础指令》
  • 动态规划DP 最长上升子序列模型 登山(题目分析+C++完整代码)
  • RocketMQ实战—2.RocketMQ集群生产部署
  • 车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇