2012-09-14 16 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)); 
相关问题