2

几天前,我问了一个关于从文件读取直到输入完成的问题。我收到了一些我研究过的回复,但我有一个与该主题相关的问题:为什么我必须使用一些额外的测试、“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());}

检查 reading.available() 的值是对输入端更好的测试还是同样糟糕?

4

2 回答 2

3

用异常控制执行流程并不优雅。EOF 是读取文件时的正常情况,因此应以其他方式处理。

更优雅的代码是:

byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
  // process the first `nread` bytes of `buf`
}

来源:要从 java 中的 DataInputStream 读取的未知缓冲区大小

在这里你可以找到很好的解释为什么你不应该用异常来控制流:Why not use exceptions as regular flow of control?

于 2012-11-09T19:19:36.190 回答
0

您需要 finally 子句来关闭资源。有可能没有命中EOF并且 finally 块仍然需要执行。此外,上面的代码很糟糕,永远不应该在生产系统中使用,特别是因为您知道文件结束时的情况。理想情况下,其他对此进行评论的人也发表了相同的声明。将异常视为“正常”程序执行流程是解决软件工程问题的最不利方法。

于 2012-11-09T19:20:41.757 回答