惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
Java异常处理
记忆环游记 · 2026-06-23 · via 博客园_首页

Java 异常处理完整样例+详细讲解

一、异常基础概念

1. 异常:程序运行时发生的非正常错误,会中断正常执行流程
2. 分类:

  • 受检异常(Checked Exception):编译期必须处理(IO、文件、SQL等)
  • 非受检异常(Unchecked Exception):运行时异常,编译不强制捕获( NullPointerException 、 ArrayIndexOutOfBoundsException )
  • Error:系统级致命错误,无需捕获(内存溢出、栈溢出)
    3. 处理关键字: try-catch 、 finally 、 throw 、 throws

二、基础 try-catch-finally 完整示例

java

public class ExceptionDemo1 {
public static void main(String[] args) {
int[] arr = {10, 20, 30};

try {
// 可能抛出异常的代码块
System.out.println("开始执行try代码块");
// 数组下标越界,抛出 ArrayIndexOutOfBoundsException
System.out.println(arr[5]);
System.out.println("这句不会执行,前面已报错");
} catch (ArrayIndexOutOfBoundsException e) {
// 捕获对应类型异常,异常处理逻辑
System.out.println("捕获到数组下标越界异常");
// 打印异常完整堆栈信息,定位错误
e.printStackTrace();
// 获取异常描述信息
System.out.println("异常信息:" + e.getMessage());
} finally {
// 无论是否异常、是否return,finally一定会执行(唯一例外:System.exit(0))
System.out.println("finally 代码块执行,常用于释放资源:关闭文件、数据库连接");
}

// try-catch处理完异常后,程序继续往下走,不会崩溃
System.out.println("程序正常结束");
}
}

代码解释

1.  try :包裹有风险的代码,监控异常
2.  catch(异常类型 e) :捕获指定类型异常,编写补救逻辑;可写多个 catch 捕获不同异常
3.  finally :资源释放专用,必执行

三、多catch捕获多种异常

规则:子类异常放前面,父类异常放最后(如 Exception 写最底部)

java

public class ExceptionDemo2 {
public static void main(String[] args) {
try {
String str = null;
System.out.println(str.length()); // 空指针异常
// int num = Integer.parseInt("abc"); // 数字格式异常
} catch (NullPointerException e) {
System.out.println("捕获空指针异常");
} catch (NumberFormatException e) {
System.out.println("捕获数字转换异常");
} catch (Exception e) {
// Exception是所有异常父类,兜底捕获全部未知异常
System.out.println("捕获所有其他异常");
}
}
}

四、throws 抛出异常(方法声明抛出)

适用于自身不处理异常,交给调用者处理,多用于受检异常

java

import java.io.File;
import java.io.FileNotFoundException;

public class ExceptionDemo3 {
// throws 声明该方法可能抛出文件未找到异常,强制调用者处理
public static void readFile() throws FileNotFoundException {
File file = new File("test.txt");
// 文件不存在会抛出受检异常,方法不捕获,直接抛出
new java.io.FileReader(file);
}

public static void main(String[] args) {
// 调用带throws的方法,两种处理方式
try {
readFile();
} catch (FileNotFoundException e) {
System.out.println("文件不存在,请检查路径");
}
}
}

五、throw 手动主动抛出异常

主动制造异常,用于参数校验、业务逻辑拦截

java

public class ExceptionDemo4 {
public static void checkAge(int age) {
if (age < 0 || age > 120) {
// 手动抛出运行时异常
throw new RuntimeException("年龄不合法:" + age);
}
System.out.println("年龄合法:" + age);
}

public static void main(String[] args) {
try {
checkAge(200);
} catch (RuntimeException e) {
System.out.println("校验失败:" + e.getMessage());
}
}
}

六、try-with-resources 自动关闭资源(JDK7+推荐)

替代finally手动关流,实现 AutoCloseable 接口的资源自动释放,简化IO/数据库代码

java

import java.io.FileReader;
import java.io.IOException;

public class ExceptionDemo5 {
public static void main(String[] args) {
// 括号内创建流,执行完毕自动关闭,无需finally
try (FileReader fr = new FileReader("demo.txt")) {
char ch = (char) fr.read();
System.out.println(ch);
} catch (IOException e) {
System.out.println("文件读取失败:" + e.getMessage());
}
}
}

七、自定义业务异常(企业开发常用)

内置异常无法区分业务错误,自定义异常统一处理业务报错

  1. 自定义异常类

java

// 自定义运行时业务异常
public class BusinessException extends RuntimeException {
private Integer code; // 错误码

public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}

public Integer getCode() {
return code;
}
}

  1. 使用自定义异常

java

public class ExceptionDemo6 {
public static void login(String username) {
if (!"admin".equals(username)) {
// 抛出自定义业务异常
throw new BusinessException(4001, "用户名不存在");
}
System.out.println("登录成功");
}

public static void main(String[] args) {
try {
login("test");
} catch (BusinessException e) {
System.out.println("错误码:" + e.getCode() + ",错误信息:" + e.getMessage());
}
}
}

八、核心使用总结

1. 运行时异常:可捕获可不捕获,建议提前做判空、边界校验避免抛出
2. 受检异常:必须 try-catch 或 throws ,编译报错
3.  throw :方法内部主动抛; throws :方法签名声明可能抛
4. 资源操作(文件、连接、流)优先使用  try-with-resources 
5. 业务系统建议自定义异常,统一返回错误码与提示
6.  finally 适合必须执行的清理逻辑,禁止在finally写return,会覆盖try中的返回值