01 异常发生场景

  • 使用ObjectInputStream类往文件中传入自定义类student时

ObjectInputStream objectInputStream=null;
        ArrayList<Student> students=null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));
            students = (ArrayList<Student>) objectInputStream.readObject();
            System.out.println("数据载入成功");
​
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("数据载入失败");
        }

02 异常产生原因

  • 经过导师查找,终于发现了OFException产生的原因

  • ObjectInputStream objectInputStream=null;
    //idea上显示null为灰色,说明 new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));返回值为null,即文件"D:\\桌面\\java38\\javase08\\java08\\1.txt"为空
    objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));
  • objectInputStream为空值,则不能使用objectInputStream.close();如果使用会产生并发症 java.lang.NullPointerException(空指针异常)

03 异常解决

        ObjectInputStream objectInputStream=null;
        ArrayList<Student> students=null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));
            students = (ArrayList<Student>) objectInputStream.readObject();
            System.out.println("数据载入成功");
​
        } catch (EOFException e) {
            students = new ArrayList<>();
​
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("数据载入失败");
        } finally {
            if(objectInputStream != null) {
                objectInputStream.close();
            }
  • 在finally语句内加上判断,不等于空值才关闭

  • 捕获EOFException,但不打印错误,为students,new一个新的集合(本来这里也有一个会出bug的地方,但是被我之前就给students赋了null值,(ArrayList<Student> students=null;)所以catch里new一个新的对象)

  • 如果不为空,则 students = (ArrayList<Student>) objectInputStream.readObject();正常执行,不报错误

04 总结

  • java.io.EOFException不是一个常出现的问题,而且并发症 java.lang.NullPointerException(空指针异常),只有objectInputStream.readObject();接收为null且1.txt文件为空时才会出现

  • EOFException只需要捕获,该bug在本场景下被捕获后程序就不会终止了,甚至不处理也行。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐