2016-06-14 55 views
-3

我想让您使用printStackTrace(PrintWriter s)方法思考一个小问题。我需要在追加模式下使用它。异常 - 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"); 
     } 
    } 

注意

新的FileWriter( “mylog.txt”,真正的);

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

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

谢谢。

+1

发布的例外是针对上述有益的。 – Underbalanced

+0

java.lang.NullPointerException \t at java.lang.String。 (String.java:554) \t在测试$ HandleRequests.run(Test.java:72) \t在java.lang.Thread.run(Thread.java:745) –

回答

1

添加到什么krzyk提到

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(); 
} 
+0

非常感谢您对我们的解释:) –

+1

为什么不使用try-with-resources? –

+1

另外,关闭PrintWriter也会关闭FileWritter,所以在执行'fw.close()' –

0

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

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

可以将此代码是好的? 尝试PrintWriter w = new PrintWriter(new FileWriter(“mylog.txt”,true)); e.printStackTrace(w); w.close; } catch(...){ ... } –