当前位置:首页 > 系统bug > 正文内容

一个简单的Java程序 EOFException – 如何处理?

2019-06-08 | 分类:系统bug | 评论:0人 | 浏览:97次

eofexception

我是一个初学java程序员,遵循java教程

我正在使用Java教程数据流页面中的一个简单的Java程序,并且在运行时,它一直在显示EOFException。我想知道这是否正常,因为读者必须最终到达文件的末尾。

那么,这是否意味着捕获EOFException是正常的,所以只是捕获它而不是处理它很好,这意味着文件的结尾已经达到了?

如果这意味着我应该处理它,请告诉我如何做到这一点。

编辑

从建议中,我通过使用固定它in.available() > 0while循环条件。

或者,我无法处理异常,因为它很好。

从文件中读取时,您的循环不会终止。所以它读取所有值并在下面的读取的下一次迭代中正确抛出EOFException:

 price = in.readDouble();

如果您阅读文档,它会说:

抛出:

EOFException – 如果此输入流在读取八个字节之前到达结尾。

IOException – 流已关闭,并且包含的​​输入流在关闭后不支持读取,或发生另一个I / O错误。

在while循环中设置适当的终止条件以解决问题,例如:

     while(in.available() > 0)  <--- if there are still bytes to read

当没有更多的数据这个循环将退出目前可用来阅读,不是仅仅在流的末尾。InputStream.available()不是对流结束的测试。见Javadoc

处理此问题的最佳方法是使用适当的条件终止无限循环。

但是因为你要求进行异常处理:

尝试使用两次捕获。您的EOFException是预期的,因此在发生时似乎没有问题。应该处理任何其他例外。

...
} catch (EOFException e) {
   // ... this is fine
} catch(IOException e) {
    // handle exception which is not expected
    e.printStackTrace(); 
}

你可以用while(in.available() != 0)而不是while(true)

你抓住IOException哪个也抓到了EOFException,因为它是遗传的。如果你看一下教程中的例子,他们强调你应该抓住EOFException– 这就是他们所做的。为了解决你EOFException之前遇到的问题IOException

try
{
    //...
}
catch(EOFException e) {
    //eof - no error in this case
}
catch(IOException e) {
    //something went wrong
    e.printStackTrace(); 
}

除此之外,我不喜欢使用异常的数据流控制 – 它不是异常的预期用途,因此(在我看来)非常糟糕的风格。

image

 

 

 

您可能会遇到从a读取InputStream并使用代码段while(in.available()>0)检查流末尾的代码 ,而不是检查EOFException(文件末尾)。

这种技术的问题,以及Javadoc它的回应是,它只告诉你可以在不阻塞下一个调用者的情况下读取的块数。换句话说,它return 0甚至可以读取更多字节。因此,InputStream available()永远不应该使用该方法来检查流的结尾。

你必须使用while (true)

catch(EOFException e) {
//This isn't problem
} catch (Other e) {
//This is problem
}
来源:赵大虾博客(微信号/QQ号:),转载请注明出处,谢谢!

  • 评论:(0)

已有 0 位网友发表了一针见血的评论,你还等什么?

◎欢迎参与讨论!

傲笑九天志在必得, 卧薪尝胆勇者无畏

站内搜索

傲笑九天志在必得, 卧薪尝胆勇者无畏

傲笑九天志在必得, 卧薪尝胆勇者无畏