【问题标题】:Exception - printStackTrace(Printwriter s) method异常 - printStackTrace(Printwriter s) 方法
【发布时间】:2016-10-15 13:05:43
【问题描述】:

我想让你思考一个使用 printStackTrace(PrintWriter s) 方法的小问题。我需要在附加模式下使用它。

下面的例子解释了我的意思:

try {

    } catch (Exception e) {
        try {
            e.printStackTrace(new PrintWriter(new FileWriter("mylog.txt", true)));        
        } catch (IOException ioe) {
            System.out.println("I can't open the file mylog.txt");
        }
    }

注意

new FileWriter("mylog.txt", true);

是我以附加模式打开文件(并第一次创建它,因为它不存在)的方式。

结果是文件中只有最后一个异常,而不是一系列异常。有一次,该方法打开了一个没有写入任何内容的文件。 我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 发布异常对上述情况会有所帮助。
  • java.lang.String 处的 java.lang.NullPointerException。(String.java:554) 处的 Test$HandleRequests.run(Test.java:72) 处的 java.lang.Thread。运行(Thread.java:745)

标签: java exception printwriter printstacktrace


【解决方案1】:

您应该关闭创建的Writers,不关闭它可能会导致您描述的问题。

try (PrintWriter writer = new PrintWriter(new FileWriter("mylog.txt", true))) {
    e.printStackTrace(writer);
}

【讨论】:

  • 这段代码可以吗??尝试 { PrintWriter w = new PrintWriter(new FileWriter("mylog.txt", true)); e.printStackTrace(w); w.关闭; } 捕捉 (...) { ... }
【解决方案2】:

添加到 krzyk 提到的内容

Per OutputStreamWriter.close() :关闭流,首先刷新它。一旦流被关闭,进一步的 write() 或 flush() 调用将导致抛出 IOException。关闭之前关闭的流没有任何效果。

如前所述,如果您不调用 close 并且此 try{}catch 被频繁触发,则您没有将内容刷新到文件中。

应该写成这样

try {

} catch (Exception e) {
    try {
        FileWriter fw = new FileWriter("mylog.txt", true)
        e.printStackTrace(new PrintWriter(fw));
        fw.close();
    } catch (IOException ioe) {
        System.out.println("I can't open the file mylog.txt");
    }
}

更好的方法是

FileWriter fw = new FileWriter("mylog.txt", true);
PrintWriter pw = new PrintWriter(fw);
try {

} catch (Exception e) {
    try {
        e.printStackTrace(pw);
    } catch (IOException ioe) {
        System.out.println("I can't open the file mylog.txt");
    }
}finally {
     pw.close();
     fw.close();
}

【讨论】:

  • 非常感谢您的解释:)
  • 为什么不使用 try-with-resources?
  • 还有,关闭PrintWriter也会关闭FileWritter,所以fw.close()
  • 为什么不使用 try-with-resources? - 当然这也是一个选项,实际上是一个更好的选项。\r \r 另外,关闭 PrintWriter 也会关闭 FileWritter,因此执行 fw.close() 毫无意义 - 实际上,最好使用它,否则执行 fw。 close() 将关闭 PrintWriter...所以 pw.close() 是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多