1370 字
7 分钟
Java-第四章-异常处理
Note
程序运行中难免出现错误,本章学习Java异常处理机制:异常分类、try-catch-finally、throws/throw、自定义异常,让程序在出错时也能正常执行,是Java开发必备技能!
异常是程序在编译或运行阶段出现的错误/非正常情况(如除零运算、数组越界、空指针等),Java提供专门的异常处理机制,避免程序直接崩溃,保证程序的健壮性。 程序中的 “对象”,通过封装、继承、多态三大特性实现代码复用与程序扩展。本节我们重点讲解面向对象进阶核心:继承、final关键字、抽象类和接口、多态、Object类、内部类。
异常的核心概念
-
定义:程序运行时发生的非正常事件,会中断正常的指令执行流程。
-
异常体系:所有异常都继承自
java.lang.Throwable类,分为两大分支:- Error(错误):JVM系统级错误(如栈溢出、内存溢出),程序无法处理,无需捕获。
- Exception(异常):程序级错误,可以通过代码捕获并处理,是学习重点。
-
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("程序正常结束"); }}运行效果
异常:除数不能为0finally代码块执行,资源释放程序正常结束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()); } }}运行效果
年龄不合法:200throws 声明异常
在方法声明处标记可能抛出的异常,将异常交给方法的调用者处理。
- 编译时异常必须用
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()); } }}运行效果
年龄不能为负数!常见内置异常
ArithmeticException:算术异常(除零)NullPointerException:空指针异常(调用null对象的方法/属性)ArrayIndexOutOfBoundsException:数组索引越界IllegalArgumentException:参数不合法ClassNotFoundException:类未找到(编译时异常)IOException:输入输出异常(编译时异常)Exception:写在最后面进行兜底处理,避免未考虑到的异常导致程序崩溃
总结
- 异常分为Error(不可处理)和Exception(可处理),Exception又分编译时和运行时异常。
- 核心处理方式:
try-catch-finally捕获处理,throw手动抛异常,throws声明异常。 - 自定义异常继承现有异常类,适配业务场景,提升代码可读性。
finally块必执行,常用于关闭文件、数据库连接等资源。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
Java-第四章-异常处理
https://blog.pigeons2023.asia/posts/20260328/