System.out.println()不会抛出异常,但System.in.read()会抛出异常,为什么?

时间:2009-10-22 20:12:06

标签: java

我是从 Java™I / O,第2版获得的 作者:Elliotte Rusty Harold:


围绕每次调用System.out.println()包装一个try / catch块是不方便的,Sun决定让PrintStream(以及后来的PrintWriter)捕获并吃掉print()或println中抛出的任何异常( ) 方法。如果你想检查print()或println()方法中的异常,可以调用checkError():

public boolean checkError()

如果在此打印流上发生异常,则checkError()方法返回TRue,如果没有,则返回false。它只告诉您发生了错误。它不会告诉您发生了什么类型的错误。如果您需要了解有关错误的更多信息,则必须使用不同的输出流或编写器类。


我只是测试了这个checkError方法的真实返回类型....

为此创建一些实际场景的任何线索...... : - )

1 个答案:

答案 0 :(得分:4)

以下是checkError()将返回true的几种情况:

情景#1

  1. 将文件的输出流打开到小文件系统/设备;例如一张软盘?
  2. 创建PrintStream
  3. 循环写入PrintStream。
  4. 最终文件系统将填满,写入将失败。

    情景#2

    1. 打开与某个HTTP服务器的URL连接。
    2. 获取连接的OutputStream
    3. 创建PrintStream
    4. 将一些输出写入PrintStream。
    5. 在连接上调用getStatus(),或者调用closeConnection
    6. 尝试多写一些输出。
    7. 写入现在应该失败,因为HTTP连接不再处于将数据发送到远程服务器的正确状态。

      这些场景是实用的,因为你应该能够让它们给你错误。但它们并不完全现实。例如,您通常不会使用PrintStream将POST数据发送到HTTP服务器。但这是OutputStream与PrintStream API之间差异的根源。 OutputStream / Writer API设计用于应用程序需要知道输出是否失败的用例。 PrintStream / PrintWriter API专为“轻量级”用例而设计,例如将用户消息输出到控制台,其中处理失败......嗯......浪费程序员的努力。