这是一段代码,它随机抛出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可能会优化代码,并且在处理随机输入时会遇到一些错误。但这只是猜测。有谁知道原因?