PrintWriter和PrintStream永远不会抛出IOExceptions

时间:2008-11-17 23:09:44

标签: java api exception

前几天我意识到PrintWriter(以及PrintStream在写,刷新或关闭时从不抛出IOException

相反,它会在发生错误时设置内部标志(trouble=true) 这不可能得到确切的例外,但只有如果存在异常(checkError())。

我的问题是:为什么会有这样的行为? API设计不是那么糟糕吗?

6 个答案:

答案 0 :(得分:10)

我认为,由于System.outSystem.errPrintStream的实例,因此提供了一些更宽松的错误处理。正如其他海报提到的那样,这可能为1995年左右从C / C ++过渡的那些顺利铺平道路。当添加Reader / Writer API时,创建PrintWriter以与现有PrintStream并行。

一种非常需要此行为的应用程序是日志记录。日志记录是较大应用程序的辅助工具。通常,如果日志记录失败,则不希望整个应用程序失败。因此,至少System.err忽略异常是有道理的。

答案 1 :(得分:7)

我想知道它是否因为IOExceptions被检查,这将要求你在每个System.out周围放置一个try catch块。调用

更新:或者抛出方法签名。

这会很快变得烦人。

答案 2 :(得分:1)

我真的不知道这个故事,但我认为这对于那些设计师希望能够使用简单的stdio打印方法而不需要知道什么是异常的新程序员来说更容易。所以在这方面它是一个很好的设计(虽然我同意你的意见)。

答案 3 :(得分:1)

Sun / Oracle应该添加两个类似于类的函数,一个抛出IOException而另一个不抛出任何东西。

答案 4 :(得分:0)

设计可能是由来自C背景的人完成的,其中stdio错误以类似的方式处理。既然我习惯了那种范式,我就不会称之为不好,但我同意它是不一致的。

我也同意有关尝试使PrintWriter更易于使用的评论。 Java中的IO类令人困惑(至少对于我认识的每个人而言)也许有人只是想让生活变得更轻松。

答案 5 :(得分:0)

这不是设计错误。这是一种适当的设计,适合在编写输出并希望忽略错误的情况下使用。

作为典型的用例,已经提到了System.outSystem.err,但是原因不是方便或< em>平滑的C / C ++过渡。这是对这种情况的理想处理:

  • 您在控制台中启动应用程序
  • 它产生输出到标准输出/错误
  • 您关闭控制台,但您希望应用程序在后台继续运行

在这种情况下,取决于系统的实现,关闭控制台后,System.outSystem.err可能会失败,但是您不希望这样会使应用程序崩溃。希望该应用程序继续在后台运行,并且应将输出刮掉。这就是PrintWriter的作用。

如果您担心输出期间的错误,请使用FileWriterOutputStreamWriter。 如果您需要某些PrintWriter中可用的方法和FileWriter中不可用的方法,请创建自己的扩展FileWriterOutputStreamWriter的TextWriter。