【问题标题】:Using e.printStackTrace() in Java在 Java 中使用 e.printStackTrace()
【发布时间】:2011-10-29 09:08:29
【问题描述】:

这可能是一个新手问题,但希望你能帮助我。 :) 我有这样的事情:

try
{ 
//try to do something there
}
catch (IOException e)
{
//handle the exception 
e.printStackTrace();
}

我正在使用 NetBeans IDE,由于某种原因,printStackTrace 在波浪线中带有下划线。当我按 Alt+Enter 时,它说 Throwable.printStackTrace() 应该被删除。这是什么意思?谁能提供更多见解,这可能意味着什么?或者我可以忽略这个吗?

谢谢!

【问题讨论】:

    标签: java ioexception printstacktrace


    【解决方案1】:

    试试:

    e.printStackTrace(System.out);
    

    【讨论】:

    • 啊,谢谢@Pablo!疯了,为什么这会让警告完全消失?如果您不指定System.out 作为参数并将其留空,JVM 是否假定它是调试模式命令并且只输出到控制台?
    • 破解!这并不能真正解决问题,因为它只是阻止 Netbeans 显示它。这仍将输出到默认错误流。
    • @ThePerson System.err 将打印到默认错误流,而不是 System.outSystem.out 代表默认输出流。
    • 使用e.printStackTrace(System.err);会更好吗?
    【解决方案2】:

    这可能是因为printStackTrace() 并没有真正处理错误,因为它只是将堆栈转储到控制台中。它充当占位符,直到您将其替换为适当的错误处理(如果需要的话)并将输出替换为某种记录器。

    【讨论】:

      【解决方案3】:

      e.printStackTrace();

      这不是一个好的做法,因为它在默认的 ErrorStream 中打印,大多数时候是控制台!

      NetBeans 应该会就此向您发出警告。关于它的好习惯是记录消息。遵循相同的参考:

      http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

      编辑 请参阅下面的第一条评论以了解更多信息。

      【讨论】:

      • 不,它打印到默认的 Errorstream,这是一个单独的流,别名 FileDescriptor,并且可以通过管道传输到单独的文件:java YourClass 1>file.out 2>file.err - e.printStackTrace 打印到 'file.err' ,而不是“file.out”。
      • 并不总是好的做法。此控制台可能是您无法访问的 Web 服务器中的控制台。有时最好将此堆栈跟踪也转储到应用程序的当前日志中,特别是在 Web 应用程序中。
      【解决方案4】:

      这只是一个建议。在 Eclipse 中它很好 - 我相信它只是 IDE 告诉你有更传统的方法可以做到这一点,就像其他一些答案一样。 我发现它对调试很有用,并且你应该告诉用户何时会发生致命错误,使用调试模式(如控制台开关 -d)来收集这些日志。

      【讨论】:

      • 使用像 log4j 这样的日志框架是一种更好的方法。
      【解决方案5】:

      仅打印堆栈跟踪是不够的。打印异常的堆栈跟踪本身并不意味着它是完全不好的做法,但仅在发生异常时打印堆栈跟踪是一个问题。

      始终记录异常(使用良好的logging framework),但不要将它们暴露给最终用户。并确保仅在开发模式下显示堆栈跟踪。

      我自己(大部分时间)使用logger.log(Level.SEVERE, <exception>.getMessage(), <exception>);

      当netbeans建议你处理异常'Surround Statement with try-catch'时,如果你点击这个,就会产生):

      try {
          //something need to be handle(exception that throw)
      } catch (SQLException ex) {
          Logger.getLogger(ClassName.class.getName()).log(Level.SEVERE, null, ex);
      }
      

      哪个比ex.printStackTrace();好。

      这些可能会有所帮助:

      【讨论】:

        猜你喜欢
        • 2020-09-19
        • 2013-08-03
        • 2012-03-22
        • 2015-12-26
        • 2013-07-24
        • 1970-01-01
        • 2011-01-05
        • 2011-08-16
        • 1970-01-01
        相关资源
        最近更新 更多