【问题标题】:System.out.println() don't throws Exception, but System.in.read() throws Exception, Why?System.out.println() 不抛出异常,但 System.in.read() 抛出异常,为什么?
【发布时间】:2010-12-09 05:49:10
【问题描述】:

我从 Java™ I/O, 2nd Edition 得到这个 作者:Elliotte Rusty Harold:-


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

public boolean checkError( )

如果此打印流发生异常,则 checkError() 方法返回真,否则返回假。它只告诉您发生了错误。它不会告诉您发生了哪种错误。如果您需要了解有关错误的更多信息,则必须使用不同的输出流或写入器类。


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

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

【问题讨论】:

标签: java


【解决方案1】:

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

场景 #1

  1. 为一个小文件系统/设备打开一个文件的输出流;例如软盘?
  2. 创建打印流
  3. 循环写入 PrintStream。

最终文件系统将被填满,写入将失败。

场景 #2

  1. 打开到某个 HTTP 服务器的 URL 连接。
  2. 获取连接的 OutputStream
  3. 创建打印流
  4. 将一些输出写入 PrintStream。
  5. 在连接上调用getStatus(),或者调用closeConnection
  6. 尝试多写一些输出。

现在写入应该会失败,因为 HTTP 连接不再处于向远程服务器发送数据的正确状态。

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

【讨论】:

  • 我已经尝试了你建议的两种情况,并且在这两种情况下 checkError() 都返回真(干杯:))。但是这最后一行(来自原始帖子)对我来说并不清楚。 “如果您需要了解有关错误的更多信息,则必须使用不同的输出流或编写器类。”
  • 他的意思是 Print* API 没有提供任何方法来获取导致打印机对象进入错误状态的异常。
  • 您建议的场景会弹出一个新问题。 in,out 都在 System 类中声明为 public static final,那么如何为这些调用 setter。 final 应该只初始化一次???
  • 看看System.setIn()和朋友们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多