2016-06-14 3 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 упоминается

Per OutputStreamWriter.close(): Закрывает поток, промывке его первым. Как только поток будет закрыт, дополнительные вызовы write() или flush() вызовут исключение IOException. Закрытие ранее закрытого потока не влияет.

Как уже упоминалось, если вы не вызываете близко, и этот 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 s, не закрывая его, это может вызвать проблемы, которые вы описываете.

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

Может ли этот код будет нормально ?? try { PrintWriter w = new PrintWriter (новый файлWriter ("mylog.txt", true)); e.printStackTrace (w); w.close; } catch (...) { ... } –