2016-06-14 84 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(...){ ... } –