几天前,我问了一个关于从文件中读取的问题,直到输入结束。我收到了一些我研究过的回复,但我有一个问题与某个主题有关:为什么我必须使用一些额外的测试,“finally”子句和另一个try-catch而不仅仅是:
DataInputStream reading = null;
try{
reading = new DataInputStream(new FileInputStream("tes.t"));
while(true)
{
System.out.println(reading.readInt());
System.out.println(reading.readDouble());
}
}catch(IOException xxx){System.err.println("Error: " + reading.getMessage());}
catch(EOFException xxx){reading.close();}
为什么这还不够?我的意思是 - 一旦我们达到EOF,我们就会有例外。否则,我们捕获异常并打印错误消息。为什么我们需要额外的测试?这种方法有什么问题?
编辑:好的,我现在明白为什么这是一件坏事。但是,如果我制作这样的代码呢?DataInputStream reading = null;
try{
reading = new DataInputStream(new FileInputStream("tes.t"));
while(reading.available()!=0)
{
System.out.println(reading.readInt());
System.out.println(reading.readDouble());
}
}catch(EOFException xxx){}
catch(IOException xxx){System.err.println("Error: " + reading.getMessage());}
检查read.available()的值是对输入端的更好测试还是同样差?
答案 0 :(得分:3)
使用异常控制执行流程并不优雅。 EOF是读取文件时的正常情况,因此应以其他方式处理。
更优雅的代码是:
byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
// process the first `nread` bytes of `buf`
}
来源:Unknown buffer size to be read from a DataInputStream in java
以下是您可以找到非常好的解释,为什么您不应该控制具有例外的流量:Why not use exceptions as regular flow of control?
答案 1 :(得分:0)
您需要finally子句来关闭资源。可能不会命中EOF
并且最终块仍然需要执行。此外,上述代码是残酷的,不应该在生产系统中使用,特别是因为您知道文件结束时的情况。理想情况下,审查这一点的其他人也做了同样的陈述。将异常视为“正常”程序执行流程是解决软件工程问题的最不利方法。