gpt4 book ai didi

Java:无法使用 "throw exception"时打印到文件

转载 作者:行者123 更新时间:2023-11-29 06:24:19 25 4
gpt4 key购买 nike

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

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

谢谢

最佳答案

在您的 run() 方法中处理检查异常是棘手的,原因如下:

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

    <
  2. 如果您捕获它们并将它们包裹在未经检查的异常中重新抛出,它们很可能不会被 main 线程注意到。为什么?因为异常是在子线程的栈上抛出的。除非它们被run() 方法捕获,否则它们将由线程的UncaughtExceptionHandler 处理。对象 ... 这可能是默认处理程序 ... 将堆栈跟踪写入 System.err,然后丢弃异常。

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

  4. 写入输出文件时抛出的任何 IOException 都表明出现了严重的错误;例如文件系统已满,或者您正在写入的套接字或管道损坏/关闭。因此,简单地忽略它可能是一个大错误。 (例如,假设文件很珍贵,应用程序做的最后一件事是删除文件的旧版本并用我们刚刚创建的新版本替换它。糟糕!我们没有注意到 FS已满,新版本的文件已损坏,我们刚刚删除了旧版本。)

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

关于Java:无法使用 "throw exception"时打印到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com