1370 字
7 分钟

Java-第四章-异常处理

2026-03-28
浏览量 加载中...
Note

程序运行中难免出现错误,本章学习Java异常处理机制:异常分类、try-catch-finally、throws/throw、自定义异常,让程序在出错时也能正常执行,是Java开发必备技能!

异常是程序在编译或运行阶段出现的错误/非正常情况(如除零运算、数组越界、空指针等),Java提供专门的异常处理机制,避免程序直接崩溃,保证程序的健壮性。 程序中的 “对象”,通过封装、继承、多态三大特性实现代码复用与程序扩展。本节我们重点讲解面向对象进阶核心:继承、final关键字、抽象类和接口、多态、Object类、内部类。

异常的核心概念#

  1. 定义:程序运行时发生的非正常事件,会中断正常的指令执行流程。

  2. 异常体系:所有异常都继承自 java.lang.Throwable 类,分为两大分支:

    • Error(错误):JVM系统级错误(如栈溢出、内存溢出),程序无法处理,无需捕获。
    • Exception(异常):程序级错误,可以通过代码捕获并处理,是学习重点。
  3. Exception 分类

    • 编译时异常(受检异常):编译阶段就会报错,必须处理(如文件未找到、IO异常)。
    • 运行时异常(非受检异常):运行阶段才报错,编译不报错(如除零、空指针、数组越界)。

异常处理的关键字#

Java 提供5个核心关键字实现异常处理:

  • try:监听可能出现异常的代码块
  • catch:捕获并处理指定类型的异常
  • finally:无论是否发生异常,一定会执行的代码块(常用于资源释放)
  • throw:手动抛出一个异常对象
  • throws:方法声明中,声明该方法可能抛出的异常

try-catch-finally 基础语法#

这是最常用的异常处理结构,捕获并处理异常,避免程序崩溃。

1. 语法规则#

try {
// 可能抛出异常的代码
} catch (异常类型1 变量名) {
// 处理异常类型1的逻辑
} catch (异常类型2 变量名) {
// 处理异常类型2的逻辑
} finally {
// 无论是否异常,最终执行的代码(可选)
}

2. 示例#

public class ExceptionTest {
public static void main(String[] args) {
try {
// 可能发生异常的代码:除零运算
int a = 10 / 0;
System.out.println("正常执行");
} catch (ArithmeticException e) {
// 捕获算术异常
System.out.println("异常:除数不能为0");
// 打印异常详细信息
e.printStackTrace();
} finally {
// 最终一定会执行
System.out.println("finally代码块执行,资源释放");
}
// 异常处理后,程序继续执行
System.out.println("程序正常结束");
}
}

运行效果

异常:除数不能为0
finally代码块执行,资源释放
程序正常结束
java.lang.ArithmeticException: / by zero
at ExceptionTest.main(ExceptionTest.java:5)

throw 手动抛出异常#

主动在代码中创建异常对象并抛出,适用于业务逻辑异常(如年龄不合法、账号错误)。

1. 示例#

public class ThrowTest {
// 定义方法:校验年龄
public static void checkAge(int age) {
if (age < 0 || age > 150) {
// 手动抛出运行时异常
throw new RuntimeException("年龄不合法:" + age);
}
System.out.println("年龄合法");
}
public static void main(String[] args) {
try {
checkAge(200);
} catch (RuntimeException e) {
System.out.println(e.getMessage());
}
}
}

运行效果

年龄不合法:200

throws 声明异常#

方法声明处标记可能抛出的异常,将异常交给方法的调用者处理。

  • 编译时异常必须用 throws 声明或 try-catch 处理
  • 运行时异常可省略声明

1. 示例#

public class ThrowsTest {
// 方法声明抛出编译时异常(IOException)
public static void readFile() throws Exception {
// 模拟读取文件(可能产生文件未找到异常)
throw new Exception("文件不存在");
}
public static void main(String[] args) {
try {
// 调用声明异常的方法,必须处理
readFile();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

运行效果

文件不存在

自定义异常#

Java内置异常无法满足业务需求时,可自定义异常类,继承 Exception(编译时异常)或 RuntimeException(运行时异常)。

1. 语法规则#

// 自定义运行时异常
public class 自定义异常名 extends RuntimeException {
// 无参构造
public 自定义异常名() {
super();
}
// 带提示信息的构造
public 自定义异常名(String message) {
super(message);
}
}

2. 示例#

// 1. 自定义异常:年龄不合法异常
class AgeIllegalException extends RuntimeException {
public AgeIllegalException() {
super();
}
public AgeIllegalException(String message) {
super(message);
}
}
// 2. 测试自定义异常
public class CustomExceptionTest {
public static void checkAge(int age) {
if (age < 0) {
// 抛出自定义异常
throw new AgeIllegalException("年龄不能为负数!");
}
}
public static void main(String[] args) {
try {
checkAge(-5);
} catch (AgeIllegalException e) {
System.out.println(e.getMessage());
}
}
}

运行效果

年龄不能为负数!

常见内置异常#

  1. ArithmeticException:算术异常(除零)
  2. NullPointerException:空指针异常(调用null对象的方法/属性)
  3. ArrayIndexOutOfBoundsException:数组索引越界
  4. IllegalArgumentException:参数不合法
  5. ClassNotFoundException:类未找到(编译时异常)
  6. IOException:输入输出异常(编译时异常)
  7. Exception:写在最后面进行兜底处理,避免未考虑到的异常导致程序崩溃

总结#

  1. 异常分为Error(不可处理)和Exception(可处理),Exception又分编译时和运行时异常。
  2. 核心处理方式:try-catch-finally 捕获处理,throw 手动抛异常,throws 声明异常。
  3. 自定义异常继承现有异常类,适配业务场景,提升代码可读性。
  4. finally 块必执行,常用于关闭文件、数据库连接等资源。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Java-第四章-异常处理
https://blog.pigeons2023.asia/posts/20260328/
作者
Pigeons2023
发布于
2026-03-28
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Pigeons2023
不曾与你分享的时间,我在进步.
公告
欢迎光临我的博客 🎉 ,这里会分享我的日常和学习中的收集、整理及总结,希望能对你有所帮助:) 💖
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
19
分类
4
标签
6
总字数
62,837
运行时长
0
最后活动
0 天前

目录