PrintWriter和PrintStream永远不会抛出IOExceptions

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

相反,它会在发生错误时设置内部标志( trouble=true )。
它不可能得到确切的exception,但只有有一些exception时才会出现( checkError() )。

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

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

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

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

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

这会很快变得烦人。

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

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

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

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