简介:全面讲解Java异常体系结构、异常处理语法、文件求最大值实战、自定义异常开发,附带完整实训代码,零基础也能看懂掌握。
目录
前言:什么是Java异常处理机制
异常类整体层次结构
Java常见异常处理方式
实战案例:读取数据文件查找最大值
自定义异常类开发与使用
异常处理综合实训任务
总结
1. 前言:什么是Java异常处理机制
程序编写完成语法无误,不代表运行不会出错。在实际运行中,会出现数组下标越界、空对象调用、除数为0、文件读取失败、网络断开、非法数据录入等意外情况,这类非正常运行状况就是异常。
Java提供一套成熟完整的异常处理机制,专门用来管理程序运行错误。
传统写法遇到错误会直接闪退崩溃,异常机制可以主动捕获错误、给出提示信息、补救业务逻辑、释放占用资源,避免程序整体终止运行,大幅提升软件健壮性、容错性与稳定性。
异常机制核心作用:分离正常业务代码与错误处理代码,规范错误抛出、传递、捕获流程,方便开发调试与后期维护。
2. 异常类整体层次结构
Java中所有异常、错误都继承自Throwable顶级父类,整体分为两大分支:Error和Exception。
2.1 Error 系统级错误
属于虚拟机底层严重错误,程序无法捕获、无法手动处理,出现后程序基本无法恢复运行。
常见场景:内存溢出、虚拟机崩溃、栈溢出等。
2.2 Exception 程序级异常
日常开发中重点处理的异常,代码可以捕获并修复,分为两大类:
运行时异常 RuntimeException
编译不报错,运行期间才触发,编译器不强制处理。
常见:空指针异常、数组越界、类型强转异常、算术除零异常。
编译时受检异常
编译阶段强制校验,必须处理否则无法运行。
常见:文件IO异常、网络异常、类不存在异常。
层级结构图
Throwable
├─ Error       系统严重错误,不可处理
└─ Exception   可处理程序异常
   ├─ RuntimeException 运行时异常
   └─ 编译时受检异常
3. Java常见异常处理方式
Java依靠关键字实现异常管控,四种常用处理方式。
3.1 try-catch-finally 捕获异常
将容易报错的代码放入try块,出现异常自动匹配对应catch执行处理逻辑;
finally块无论是否发生异常,必定执行,多用于关闭文件流、数据库连接、释放资源。
基础语法
try {
    // 可能产生异常的代码
} catch (异常类型 e) {
    // 异常处理逻辑
} finally {
    // 资源释放代码
}
3.2 throws 抛出异常
定义方法时声明可能出现的异常,将异常向上抛给调用者处理,当前方法不捕获。
3.3 throw 手动抛出异常
代码中主动创建异常对象并抛出,用于主动判定非法数据,触发异常提醒。
3.4 try-with-resources 自动释放资源
简化IO流、连接资源关闭,代码执行完毕自动释放资源,无需手动写finally关闭。
4. 实战案例:读取数据文件查找最大值
需求:读取本地txt文件中的数字数据,遍历找出最大值,加入异常处理防止文件不存在、数据格式错误等问题。
完整代码
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FindMaxNum {
    public static void main(String[] args) {
        File file = new File("data.txt");
        Scanner sc = null;
        int max = Integer.MIN_VALUE;

        try {
            sc = new Scanner(file);
            while (sc.hasNextInt()) {
                int num = sc.nextInt();
                if (num > max) {
                    max = num;
                }
            }
            System.out.println("文件中数据最大值为:" + max);
        } catch (FileNotFoundException e) {
            System.out.println("异常:数据文件不存在,请检查文件路径");
        } finally {
            if (sc != null) {
                sc.close();
            }
        }
    }
}
案例说明
捕获文件不存在异常,避免程序崩溃
循环读取文件内整数,对比求取最大值
finally中关闭扫描流,避免资源泄露
5. 自定义异常类开发与使用
Java内置异常无法满足业务特殊判定场景,可继承Exception或RuntimeException创建自定义异常,用于业务规则校验报错。
5.1 自定义异常类
// 自定义数值非法异常
public class NumIllegalException extends Exception{
    public NumIllegalException(){
        super();
    }
    public NumIllegalException(String msg){
        super(msg);
    }
}
5.2 测试调用自定义异常
public class CustomExceptionTest {
    public static void checkNum(int num) throws NumIllegalException{
        if(num < 0){
            throw new NumIllegalException("数值不能为负数,不符合业务规则");
        }
        System.out.println("数值校验通过:"+num);
    }

    public static void main(String[] args) {
        try {
            checkNum(-5);
        } catch (NumIllegalException e) {
            e.printStackTrace();
        }
    }
}
使用场景
会员等级、分数判定、金额校验、账号权限等专属业务报错,都可以使用自定义异常。
6. 异常处理综合实训任务
实训要求
自定义成绩异常类,分数超出0~100范围抛出异常
编写方法接收学生成绩,合法正常输出,非法抛出自定义异常
使用try-catch捕获异常,输出错误提示
完善异常处理结构,保证程序稳定运行
实训完整代码
// 自定义成绩异常
class ScoreException extends Exception{
    public ScoreException(String message){
        super(message);
    }
}

public class ScoreTrain {
    // 成绩校验方法
    public static void judgeScore(int score) throws ScoreException{
        if(score < 0 || score > 100){
            throw new ScoreException("成绩非法,分数必须在0-100之间");
        }
        System.out.println("成绩录入成功,当前分数:"+score);
    }

    public static void main(String[] args) {
        int stuScore = 120;
        try {
            judgeScore(stuScore);
        } catch (ScoreException e) {
            System.out.println("录入失败:"+e.getMessage());
        }
    }
}
7. 总结
异常是程序运行时非正常错误,异常机制用于容错防护,防止程序闪退崩溃。
所有异常根源为Throwable,分为Error系统错误与Exception可处理异常,包含运行时异常和编译异常。
常用处理方式:try-catch捕获、throws抛异常、throw手动抛异常、自动资源释放。
文件读取求最大值属于IO异常典型实战,日常开发高频使用。
内置异常无法满足业务时,可继承异常类创建自定义异常,实现个性化规则报错。
合理使用异常处理,能极大提升代码健壮性、可读性与后期维护效率。

更多推荐