【面试真题拆解】Java文件操作的异常类型与受检_非受检异常

以往面试的时候问Java异常好像背一背题就行,但是这个面试官水平还是很高的,换了一种问法,大概是这么问的:

Java中写了一个函数,打开了一个文件,读这个文件然后关闭,中间没有写try-catch,保存之后,编辑器自动在这个函数声明后面加了throws exception,你觉得这些exception会有哪些呢?

如果把这个函数进行修改,不读写文件,只进行简单的数据处理,这时保存之后,发现函数声明的后面没有throws这些异常了,在这种情况下是不是就不会抛出异常了?

有点懵了,完犊子。。。

主要有以下几点,掌握了应该问题不大:

文件操作的异常主要是IOException及其子类 ,属于受检异常 ,必须显式处理(要么 try-catch,要么 throws);

简单数据处理的异常多是RuntimeException 及其子类 (如空指针、数组越界),属于非受检异常 ,无需强制 throwstry-catch

受检异常要求"编译时必须处理",非受检异常是"运行时才可能出现",编译器不强制要求。

文件操作会抛出哪些异常?

复现一下面试题里的场景:

写一个文件读写函数,没加 try-catch,编辑器自动加了 throws Exception

java 复制代码
import java.io.*;

public class FileReadExample {
    // 编辑器自动加了 throws Exception,因为里面有受检异常
    public void readFile(String filePath) throws Exception {
        // 1. 打开文件流
        FileInputStream fis = new FileInputStream(filePath);
        // 2. 读取文件内容
        byte[] buffer = new byte[1024];
        int len = fis.read(buffer);
        // 3. 关闭文件流
        fis.close();
    }
}

有以下几种文件操作中常见的异常

异常类型 触发场景
FileNotFoundException 文件路径不存在、文件是目录、没有读权限
IOException 读取文件时IO错误(如磁盘损坏、网络文件系统(NFS)的连接意外中断)
EOFException 读取到文件末尾仍尝试读取

小贴士

FileNotFoundExceptionIOException 的子类,如果 throws IOException,也能覆盖 FileNotFoundException

为什么简单数据处理不需要 throws

面试题里的第二个场景:

把函数改成只做简单数据处理,编辑器就不加 throws 了。

复现一下这个场景:

java 复制代码
public class SimpleDataProcessExample {
    // 编辑器不会加 throws,因为里面都是非受检异常
    public void processData(int[] arr, String str) {
        // 1. 数组越界:ArrayIndexOutOfBoundsException(非受检)
        int num = arr[10];
        // 2. 空指针:NullPointerException(非受检)
        int len = str.length();
        // 3. 非法参数:IllegalArgumentException(非受检)
        if (arr.length == 0) {
            throw new IllegalArgumentException("数组不能为空");
        }
    }
}

这里的主要原因是:

简单数据处理的异常都是 RuntimeException 的子类,是非受检异常 ,编辑器不会强制要求 throwstry-catch

受检异常 vs 非受检异常

对比维度 受检异常(Checked Exception) 非受检异常(Unchecked Exception)
定义 编译时必须处理的异常,不处理编译不通过 运行时才可能出现的异常,编译器不强制要求处理
所属类 Exception 及其子类(除了 RuntimeException 及其子类) RuntimeException 及其子类、Error 及其子类
典型例子 IOExceptionFileNotFoundException NullPointerExceptionArrayIndexOutOfBoundsExceptionIllegalArgumentException
处理要求 必须 try-catchthrows 可以不处理,也可以处理
设计目的 提醒开发者"这里可能有外部不可控的错误,必须处理" 提醒开发者"这里有代码逻辑错误,需要修复代码"

实际开发中,文件操作的异常怎么处理?

不要直接 throws Exception,推荐显式抛出具体异常(如 throws IOException)或者 try-catch 处理,记录日志并给出友好提示。

举个例子:

java 复制代码
public void readFile(String filePath) {
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(filePath);
        byte[] buffer = new byte[1024];
        int len = fis.read(buffer);
    } catch (FileNotFoundException e) {
        System.err.println("文件不存在:" + filePath);
        e.printStackTrace();
    } catch (IOException e) {
        System.err.println("文件读取失败");
        e.printStackTrace();
    } finally {
        // 必须在 finally 里关闭流,防止内存泄漏
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
相关推荐
极小狐7 小时前
从复制粘贴到可复用组件:极狐GitLab CI/CD 组件目录实战
java·ci/cd·gitlab·devops·组件化
麻瓜code7 小时前
【Agent】Spring AI RAG 实战:本地向量库 + 云端知识库
java·人工智能·spring
小刘在重生~7 小时前
Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类
java·数据结构·list
我不会起名字3227 小时前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈
XR1234567888 小时前
医院移动医护零漫游无线网络选型指南
java·后端·struts
干到60岁退休的码农8 小时前
13.构建登录接口响应数据
java·spring boot·mybatis
苦瓜小生8 小时前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
水巷石子8 小时前
学习langChain4j的第二天,体验springBoot中的starter
java·spring boot·学习·spring·langchain4j
ly76898 小时前
Spring Bean生命周期全流程:从BeanDefinition到销毁
java·后端·spring·bean生命周期·beandefinition·初始化回调