Java:当你不能使用“抛出异常”时打印到文件

时间:2011-03-20 03:56:33

标签: java io

我有一个线程类(实现runnable)。我希望能够将文本打印到方法“run”中的文件中,但我不能添加“throws IOException”,因为run()是runnable中方法的实现。

当然,我无法在run()中使用大量的“Try-Catch”......

由于

4 个答案:

答案 0 :(得分:3)

您可以使用PrintStream包装输出,它永远不会抛出异常。

答案 1 :(得分:3)

由于以下原因,处理run()方法中的已检查异常非常棘手:

  1. 正如@kenson john所说(并且你观察到),你不能简单地让它们传播,因为run()未被声明为抛出已检查的异常。

  2. 如果你抓住它们并在未经检查的异常中重新抛出它们,它们可能会被main线程忽视。为什么?因为异常被抛出在子线程的堆栈上。除非它们被run()方法捕获,否则它们将由线程的UncaughtExceptionHandler对象处理......这可能是默认处理程序...它将堆栈跟踪写入{{1}然后丢弃异常。

  3. 现在,您可以为子线程设置另一个System.err对象,甚至为JVM设置默认UncaughtExceptionHandler。但是处理程序应该做什么?理想情况下,需要将异常报告回UncaughtExceptionHandler线程(或其他)以执行执行操作。但是,子线程或该线程的处理程序无法在主线程的堆栈上抛出异常。 (你可以做的最好的主要线程是设置一个标志或在主线程上调用main ...并希望它定期检查标志/中断状态。)

    < / LI>
  4. 写入输出文件时抛出的任何Thread.interrupt()表示严重错误;例如文件系统已满,或者您正在写入的套接字或管道已损坏/已关闭。所以简单地忽略它可能是一个很大的错误。 (例如,假设文件很珍贵,应用程序最后做的就是删除旧版本的文件并将其替换为我们刚刚创建的新版本。哎呀!我们没注意到FS填写,文件的新版本已损坏,我们刚删除旧版本。)

  5. 鉴于此,IOException方法最简单。 PrintStream将静静地捕获写入时发生的任何PrintStream,但记录发生异常的事实。因此,当IOException线程决定所有内容都应该写完时,它需要调用PrintStream.checkError()来测试是否发生了任何错误。 (不幸的是,API不允许您找出实际的异常。)

答案 2 :(得分:1)

如果要在许多地方执行特定的I / O操作而不将每个操作放在异常处理程序中,只需使用异常处理程序创建一个函数(即它不抛出)。然后调用非投掷函数来完成所有I / O.

答案 3 :(得分:1)

我理解你为什么要这样做,但我认为从run()抛出并捕获异常是不好的做法(由于下面提到的原因,这是不可能的)。

从run()生成的异常将被视为Java中的“未经检查”异常。这种异常不应该由程序员捕获,并且应该由VM来处理。

未经检查的异常通常在运行时发生,例如:NullPointerException,IllegalStateException。

IOException是java.lang.Exception的子类,被认为是Checked Exception,因此应该使用run()内的try catch或run()调用的方法来处理。