GZIPInputStream报EOFException(异常的getmessage是null)

前言

有个前人留下的日志清洗的程序,日志源是gz包的格式,后台拿到gz后进行解压并清洗日志,报错代码如下:

//代码里的file对象即为日之源的gz文件
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file)),decoder))

我将这行代码拆开,分别打断点发现报错出在GZIPInputStream这里。

报错

 存在的问题

1、EOFException是什么错误?

2、为什么EOFException的内容是null?

3、为什么会报EOFException?

解决

1、EOFException是什么错误?

当输入过程中意外到达文件或流的末尾时,抛出此异常

2、为什么EOFException的内容是null?

代码里try catch后,会将异常getmessage的内容写入error日志里,但是现在看error日志发现是个null。

下图是EOFException的api内容

 3、为什么会报EOFException?

报错得根本原因:存在一个空文件,那么为什么空文件会报EOFException呢,如下:

(1)输入流的read方法读取到文件末尾时,就会返回-1。

(2) 下图是GZIPInputStream的一段源码,也是报错的原因

因为是空文件,这个文件传入到这个方法里(即下图中的InputStream in):如(1)中描述,因为是空文件,所以读取第一个字节时直接到达文件末尾了,即返回-1;如果b=-1,则会抛出EOFException。

教训

这个代码问题太大了,在处理文件前都没有进行判空,即这个文件是不是个空文件。

猜你喜欢

转载自blog.csdn.net/Poppy_Evan/article/details/104992153
今日推荐