【问题标题】:Why does Throwable.printStackTrace takes a PrintWriter, instead of a Writer?为什么 Throwable.printStackTrace 采用 PrintWriter 而不是 Writer?
【发布时间】:2012-09-14 07:16:24
【问题描述】:

为什么 Throwable 类中的 public void printStackTrace(PrintStream s) 采用 PrintWriter 而不是 Writer?

我认为 Writer 应该是规范(接口的代码,而不是特定的实现),但它可能是我缺少的东西,因此这个问题。

【问题讨论】:

标签: java printstacktrace


【解决方案1】:

WriterPrintWriter 扩展的抽象类。 Throwable.printStackTrace 采用 PrintWriter,因为它调用了 println 方法,该方法在 Writer 类中不可用。调用println 是因为它需要打印堆栈跟踪,每行一个堆栈帧。

【讨论】:

  • 感谢@Abhinav:这是有道理的。话虽如此,与其拥有一个包装类,不如将所有糖功能(如 println)直接放入 Writer 中会很棒。这将最小化层次结构,简化使用,并节省一个额外的对象:-)。
【解决方案2】:

可能有几个原因

  • 最初的实现是使用 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));

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2011-03-06
    • 1970-01-01
    • 2013-07-01
    • 2013-07-10
    相关资源
    最近更新 更多