前几天我意识到PrintWriter(以及PrintStream)在写,刷新或关闭时从不抛出IOException 。
相反,它会在发生错误时设置内部标志(trouble=true
)
这不可能得到确切的例外,但只有如果存在异常(checkError())。
我的问题是:为什么会有这样的行为? API设计不是那么糟糕吗?
答案 0 :(得分:10)
我认为,由于System.out
和System.err
是PrintStream
的实例,因此提供了一些更宽松的错误处理。正如其他海报提到的那样,这可能为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.out
和System.err
,但是原因不是方便或< em>平滑的C / C ++过渡。这是对这种情况的理想处理:
在这种情况下,取决于系统的实现,关闭控制台后,System.out
或System.err
可能会失败,但是您不希望这样会使应用程序崩溃。希望该应用程序继续在后台运行,并且应将输出刮掉。这就是PrintWriter
的作用。
如果您担心输出期间的错误,请使用FileWriter
或OutputStreamWriter
。
如果您需要某些PrintWriter
中可用的方法和FileWriter
中不可用的方法,请创建自己的扩展FileWriter
或OutputStreamWriter
的TextWriter。