Java 异常机制详解:类型、原理、关键字与最佳实践

news/2025/1/8 18:21:11/文章来源:https://www.cnblogs.com/xswz/p/18657986

异常是 Java 程序开发中必须掌握的一部分。正确地处理异常不仅可以提高代码的健壮性,还能让程序更易维护。本篇文章将详细讲解 Java 异常的体系结构、常见类型、关键字的使用及最佳实践,帮助你全面掌握 Java 异常处理。


👉👉👉点击获取2024Java学习资料

1. 什么是异常?

异常(Exception) 是程序运行过程中出现的异常事件,可能导致程序非正常终止。Java 提供了完善的异常处理机制,以捕获和处理这些问题,避免程序崩溃。

异常的特性:

  1. 可控性:异常可以通过 try-catch 块捕获和处理。
  2. 层次化:异常类有层次结构,不同类型的异常可以分层处理。
  3. 运行时检测:Java 强制处理受检异常(Checked Exception)。

2. Java 异常的体系结构

Java 中的异常类继承自 Throwable,其主要分为两类:

  • Error:严重错误,通常不可恢复(如 JVM 崩溃、内存溢出)。
  • Exception:程序运行时的异常事件,可通过代码处理。

异常的体系结构图:

java.lang.Throwable
├── java.lang.Error(不可恢复的错误)
│   ├── StackOverflowError
│   ├── OutOfMemoryError
│   └── ...
└── java.lang.Exception(可处理的异常)├── Checked Exception(受检异常)│   ├── IOException│   ├── SQLException│   └── ...└── RuntimeException(运行时异常)├── NullPointerException├── ArrayIndexOutOfBoundsException├── ArithmeticException└── ...

3. 异常的类型

3.1 Error(错误)

Error 表示严重的 JVM 错误,一般无法通过代码处理。例如:

  • StackOverflowError:方法调用栈溢出(递归过深)。
  • OutOfMemoryError:堆内存不足。

示例:

public class ErrorExample {public static void main(String[] args) {throw new StackOverflowError("栈溢出错误!");}
}

3.2 Checked Exception(受检异常)

必须在代码中显式处理,否则无法通过编译。例如:

  • IOException:文件操作异常。
  • SQLException:数据库操作异常。

示例:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class CheckedExceptionExample {public static void main(String[] args) {try {Scanner scanner = new Scanner(new File("nonexistent.txt"));} catch (FileNotFoundException e) {System.out.println("文件未找到异常:" + e.getMessage());}}
}

3.3 Runtime Exception(运行时异常)

运行时异常无需强制处理,通常由程序逻辑错误引发。例如:

  • NullPointerException:空指针异常。
  • ArrayIndexOutOfBoundsException:数组下标越界。
  • ArithmeticException:数学运算错误(如除以零)。

示例:

public class RuntimeExceptionExample {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(arr[5]);  // ArrayIndexOutOfBoundsException}
}

4. 异常处理关键字详解

Java 提供了 5 个关键字来处理异常:trycatchfinallythrowthrows

4.1 try-catch

用于捕获并处理异常。

public class TryCatchExample {public static void main(String[] args) {try {int result = 10 / 0;} catch (ArithmeticException e) {System.out.println("捕获异常:" + e.getMessage());}}
}

注意事项:

  1. catch 块可有多个,处理不同类型的异常。
  2. 从最具体的异常到最通用的异常,按顺序书写。

4.2 finally

无论是否发生异常,finally 块的代码都会执行,通常用于释放资源。

public class FinallyExample {public static void main(String[] args) {try {int result = 10 / 2;System.out.println(result);} finally {System.out.println("执行 finally 块!");}}
}

4.3 throwthrows

  • throw:用于抛出异常实例。
  • throws:声明方法可能抛出的异常类型。

示例:

public class ThrowThrowsExample {public static void main(String[] args) throws Exception {throw new Exception("手动抛出异常!");}
}

5. Java 7 和 Java 8 对异常处理的优化

5.1 Java 7:try-with-resources

自动关闭资源,简化 try-finally 写法:

import java.io.BufferedReader;
import java.io.FileReader;public class TryWithResourcesExample {public static void main(String[] args) {try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {System.out.println(br.readLine());} catch (Exception e) {e.printStackTrace();}}
}

5.2 Java 8:Optional 和 Lambda 异常处理

在流式操作中避免空指针异常:

import java.util.Optional;public class OptionalExample {public static void main(String[] args) {String str = null;String result = Optional.ofNullable(str).orElse("默认值");System.out.println(result);  // 默认值}
}

6. 异常处理的最佳实践

  1. 避免过多的 try-catch 嵌套

    • 推荐分层处理,将异常逻辑集中到一处。
  2. 不要“吞掉”异常

    • 捕获异常后应记录日志或重新抛出。
    try {// 代码块
    } catch (Exception e) {e.printStackTrace(); // 打印日志
    }
    
  3. 合理使用自定义异常

    • 对于业务逻辑异常,推荐使用自定义异常类。
    class BusinessException extends Exception {public BusinessException(String message) {super(message);}
    }
    
  4. 使用 try-with-resources 管理资源

    • 例如文件流、数据库连接等需要关闭的资源。

7. 面试高频问题

Q1:Checked Exception 和 Runtime Exception 的区别是什么?
A:

  • Checked Exception 必须通过 try-catchthrows 声明处理;
  • Runtime Exception 可以不强制处理,通常是程序逻辑错误导致。

Q2:finally 块一定会执行吗?
A:通常会执行,但以下情况例外:

  • JVM 崩溃(如 System.exit(0) 调用);
  • 主线程被杀死。

Q3:如何自定义异常?
A:继承 ExceptionRuntimeException 类,并提供构造方法。


8. 总结

Java 异常机制是程序健壮性的重要保证。理解异常的分类、关键字用法和处理方式,可以编写出更可靠的代码。同时,面试中经常考察异常的应用场景及原理,掌握以上内容将帮助你轻松应对面试。

如果本篇内容对你有帮助,请点赞、收藏并关注,获取更多 Java 技术干货!🚀

👉👉👉点击获取2024Java学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865417.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一个使用VsCode来ssh的问题(已经打开了ssh的一个文件夹路径,怎么新开一个文件夹路径)

一、操作 使用快捷键 Ctrl+Shift+P(Windows) 或 Cmd+Shift+P (Mac)打开 命令面板 然后输入: File:Open Folder之后就可以选项新的路径打开了。。。没想到我被这个卡了好久,有点无语。

Postman配置接口挡板

0、首先需要在postman上注册并登录账号(登录前最好先备份已有的报文) 如果你在登录后发现历史存储的报文不见了,不要担心,在退出登录后将会重新显示出来。你可以将之前备份的报文导入到登录后的workspace中使用1、进入Workspace,新建Collection 2、找到新建的collection…

vue3新建项目的DevTools Settings

找到vite.config.js 注释掉这两行就消失了

Linux文件系统的安全保障---Overlayroot!

`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。 ​ 1. 制作精简文件…

DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题,修复 0xc000007b 错误

介绍 DirectX 修复工具 V4.3 是一款高效的系统修复工具,专为解决 系统异常 和 C++ 运行库 问题而设计,尤其对解决 0xc000007b 错误有着极高的修复率。本工具支持对所有版本的 DirectX 进行修复,并在增强版中新增了对 C++ 运行库问题的修复,提供了一个全面且可靠的解决方案。…

用DevEco Studio模拟器这些能力 没真机也能高效调测鸿蒙原生应用

随着鸿蒙生态的快速发展,越来越多的开发者投身于鸿蒙原生应用的开发中。然而,在实际开发中,真机设备短缺、调测场景复杂等问题常困扰着开发者。为解决这些问题,华为在DevEco Studio上为开发者提供了模拟器(Emulator)功能,帮助开发者在真机匮乏或无真机时,高效且低成本地…

renben-openstack-使用操作

管理员操作 (1)上传一个qcow2格式的centos7镜像 (2)管理员------>云主机类型------>创建云主机类型名称:Centos7VCPU数量:1内存: 1024根磁盘: 10G其他的默认点击创建云主机类型即可界面会显示如下创建公网络 (1)创建公网管理员------>网络------>创建网络…

防护用具穿戴智能监测摄像机

防护用具穿戴智能监测摄像机在现代安全管理中扮演着越来越重要的角色。这些先进设备不仅仅是简单的监视工具,更是通过整合高级技术来提升工作效率和安全性,特别是在复杂环境和危险作业场所的应用日益广泛。防护用具穿戴智能监测摄像机不仅仅是一种安全设备,更是提升工作场所…

场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?

当数据量比较大时,使用常规的方式来判重就不行了。例如,使用 MySQL 数据库判重,或使用 List.contains() 或 Set.contains() 判重就不行了,因为数据量太大会导致内存放不下,或查询速度太慢等问题。 1.空间占用量预测 正常情况下,如果将 40 亿 QQ 号存储在 Java 中的 int 类…

Forensia:红队后渗透的痕迹清理工具

简介: 红队反取证工具,用于在后期利用阶段消除一些足迹,减少有效载荷消耗并增加检测倒计时。可用于测试事件响应/取证团队的能力。 功能: 卸载Sysmon驱动 Gutmann方法文件粉碎 USNJrnl功能失效 预取功能失效 日志橡皮擦和事件日志禁用 用户辅助更新时间禁用 访问时间禁用 清…

DirectX修复工具:系统修复必备神器 修复工具 V4.3 绿色增强版

DirectX修复工具是一款专用于修复系统异常的工具,DirectX修复工具还是一款使用简单易上手操作且绿色、可免安装的修复工具。使用DirectX修复工具可自动更新C++组件且完美修复0xc000007b问题异常。如果你的电脑出现了DirectX的异常问题,可直接下载DirectX修复工具进行修复解决…

浅谈异地访问家庭网络的几种方案

家庭网络如何实现公网访问?想必是大家一直在探索的问题。本文带领大家一起来探究适合自己的解决方案吧! 为什么要实现公网访问? 要回答这个问题,每个人的答案或许不一样。但归纳在一起就是三个字爱折腾。在前面的文章中,我们讲到了如何将旧电脑打造属于自己的NAS,而如何远…