Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么捕捉EOFEException不足以了解输入';结束了吗?_Java - Fatal编程技术网

Java 为什么捕捉EOFEException不足以了解输入';结束了吗?

Java 为什么捕捉EOFEException不足以了解输入';结束了吗?,java,Java,几天前,我问了一个关于在输入完成之前读取文件的问题。我已经收到了一些我研究过的回复,但我有一个问题与主题相关:为什么我必须使用一些额外的测试,“finally”子句和另一个try-catch,而不仅仅是: DataInputStream reading = null; try{ reading = new DataInputStream(new FileInputStream("tes.t")); while(true) {

几天前,我问了一个关于在输入完成之前读取文件的问题。我已经收到了一些我研究过的回复,但我有一个问题与主题相关:为什么我必须使用一些额外的测试,“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()的值对输入端来说是更好的测试,还是同样糟糕?

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

更优雅的代码是:

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


下面是一个很好的解释,说明了为什么不应该控制流,但有异常:

您需要finally子句来关闭资源。可以不点击
EOF
,最后一个块仍然需要执行。此外,上面的代码非常糟糕,不应该在生产系统中使用,特别是因为您知道文件结束时的情况。理想情况下,其他人也会发表同样的评论。将异常视为“正常”的程序执行流是解决软件工程问题最不有利的方法。

哦,是的,我想这很糟糕,我才刚刚开始;)谢谢大家!@Straightfw lol在评论中没有恶意,只是很高兴你把这个问题带到了这样一个网站,而不是传播坏代码:)我不知道这是否适用于这里,OP使用的是一个
文件,它不是一个随机流,但它将是一个非常固定的数据量来处理。i、 e.文件的长度。然而,作为一种通用的(非面向文件的方法)同意上述方法是有效的。优雅是可以讨论的,IMO例外可以用来创建非常优雅的流控制。但事实并非如此;高效、惯用、通用、实用且不可读(Java)。@CaptainGiraffe-我明白了,谢谢:)此外,我一定会阅读您在编辑后添加的内容。谢谢在这种情况下还值得注意的是,已经有相当多的google会谈致力于使用多态性作为(而不是)流控制。有趣的谈话,但我很难看到它们很快变得惯用。当API抛出EOFEException以表示文件结束时,您别无选择,只能捕获它并做出相应的反应,因此您的第一句话在本文中毫无意义。实际上,它在任何上下文中都没有意义,因为流控制语句是例外。读取数据两次,只是为了避免像您所建议的那样捕获EOFEException,这是非常反常的。由于IOException在Exception继承权中位于EOFEException的顶部,因此您的读取永远不会关闭。它实际上会给你一些编译错误。哦,没错。我的错,代码是在post编辑器中添加的,没有编译或测试-谢谢:)您希望在检查接受的答案之前等待相当长的时间。你会有更多的眼睛和时间让别人来考虑你的问题。尽管你可能会在早期找到一个充分甚至好的答案,但作为一个资源,该网站将从其他答案中受益。我明白了。我没有接受答案,如果没有更好的答案出现,我一定会重新接受:)