在finnally块中的close函数随机抛出NPE

时间:2018-02-09 01:39:07

标签: java random jvm filereader

这是一段代码,它随机抛出in.close()的NullPointerException(我知道java8支持try-with-resources,而这段代码使用旧样式):

public static byte[] readReqFile(String filename) throws IOException {
    File f = new File(filename);
    if (!f.exists()) {
        throw new FileNotFoundException(filename);
    }
    ByteArrayOutputStream bos = new ByteArrayOutputStream((int)f.length());
    BufferedInputStream in = null;
    try {
        in = new BufferedInputStream(new FileInputStream(f));
        int buf_szie = (int)f.length();
        byte[] buffer = new byte[buf_szie];
        int len = 0;
        while (-1 != (len = in.read(buffer, 0, buf_szie))) {
            bos.write(buffer, 0, len);
        }
        return bos.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        throw e;
    } finally {
        try {
            in.close();  <-- Throws NullPointerException at this line
        } catch (IOException e) {
            e.printStackTrace();
        }
        bos.close();
    }
}

public static void main( String[] args ) throws IOException, InterruptedException
{
    String folderA, folderB;
    while (/*Find a file in folderA*/) {
        Moves the file into folderB
        readReqFile(/*the file in folderB*/);
    }
}

代码的过程是这样的。有一个程序(下面称为ProgramA)在folderA创建文件,如果这个代码片段在folderA中找到一个新文件,它会将文件移动到folderB中并读取它。然后我发现这段代码会随机在“in.close()”中抛出NullPointerException。

有趣的是,如果ProgramA定期创建文件,请说每0.1秒创建一个文件。上面的代码没问题,尝试1000次后再也不会抛出NPE。如果ProgramA创建的文件的随机间隔为0.1s到3s,则上述代码在获取每40-50个文件后抛出NPE。

我的java版本是1.8.0_111

我的猜测是,jvm可能会优化代码,并且在处理随机输入时会遇到一些错误。但这只是猜测。有谁知道原因?

0 个答案:

没有答案