2012-09-14 19 views
2

爲什麼public void printStackTrace(PrintStream s)Throwable類中使用PrintWriter而不是Writer?爲什麼Throwable.printStackTrace需要PrintWriter而不是Writer?

我認爲作家應該是規範(代碼接口,而不是具體的實現),但它可能是我失蹤的東西,因此這個問題。

+0

Writer不是接口,它是一個抽象類:http://docs.oracle.com/javase/7/docs/api/java/io/Writer.html – joergl

+0

Appendable是由Writer實現的接口。 –

+0

@joergl:你說得對。我的意思是設計意義上的「界面」,它也涵蓋(某些)抽象類。 – daniel

回答

1

WriterPrintWriter擴展的抽象類。 Throwable.printStackTrace需要PrintWriter,因爲它調用了println方法,該方法在Writer類中不可用。調用println是因爲它需要打印堆棧跟蹤,每行一個堆棧幀。

+0

謝謝@Abhinav:這是有道理的。這就是說,而不是有一個包裝類,它將所有糖的功能(如println)直接寫入Writer將是非常好的。這可以最小化層次結構,簡化使用情況,並保存一個額外的對象:-)。 – daniel

1

可能有幾個原因

  • 的最初的實現是使用的PrintStream和,改進的版本的PrintWriter。
  • 該方法打印文本行,雖然它可以創建一個PrintWriter按需,這是不理想的。

他們可以做的是接受一個Appendable,它是Writer的父母。

public void printStackTrace(Appendable appendable) { 
    PrintWriter pw = (appendable instanceof PrintWriter) ? (PrintWriter) appendable : 
     (appendable instanceof Writer) ? new PrintWriter((Writer) appendable) : 
     new printWriter(new AppendableWriter(appendable)); 
相關問題