在Java中使用e.printStackTrace()

65

这可能是一个新手问题,但我希望你能帮助我。 :) 我有类似于下面的东西:

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

我正在使用NetBeans集成开发环境,不知何故printStackTrace被标记为蜿蜒的下划线。当我按Alt+Enter时,它表示应删除Throwable.printStackTrace()。这是什么意思?有没有人能够更深入地解释一下它可能意味着什么?或者我可以忽略它吗?

谢谢!

5个回答

47

尝试:

e.printStackTrace(System.out);

啊,谢谢@Pablo!太疯狂了,为什么这样做会让警告消失呢?如果不将System.out指定为参数并留空,JVM是否会认为它是调试模式命令,并仅输出到控制台? - Ian Campbell
8
黑客攻击!这并没有真正解决问题,只是停止了Netbeans显示它。这仍然会输出到默认的错误流。 - ThePerson
1
@ThePerson System.err 会输出到默认的错误流,而不是 System.outSystem.out 表示默认的输出流。 - cst1992
1
使用 e.printStackTrace(System.err); 会更好吗? - Aaron Franke

21

这只是一个建议。在Eclipse中使用它是可以的 - 我相信这只是IDE告诉您有更传统的方法来完成它,比如其他答案中的一些方法。 我发现它在调试时很有用,并且应该告诉用户当将要发生致命错误时,使用调试模式(如控制台开关-d)来收集这些日志。


4
像log4j这样的日志框架是一种更好的方法。 - svarog

14

可能是因为printStackTrace()并没有真正处理错误,而只是在控制台中转储堆栈。它作为一个占位符,直到你用正确的错误处理方式(如果需要的话)替换它,并用某种类型的记录器替换输出。


12

e.printStackTrace();

这不是一个好的做法,因为它会将信息打印到默认的ErrorStream中,大多数情况下是控制台!

NetBeans应该会对此进行警告。正确的做法是记录日志。可以参考下面的链接:

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

编辑 查看下方的第一条评论获取更多信息。


6
不,它会打印到默认的错误流(Errorstream),这是一个单独的流,别名为FileDescriptor,并且可以被导向到另一个文件:java YourClass 1>file.out 2>file.err - e.printStackTrace 打印到 'file.err' 而不是 'file.out'。 - user unknown
2
并不总是一个好的做法。这个控制台可能是在你无法访问的Web服务器上的控制台。有时最好将此堆栈跟踪也转储到应用程序的当前日志中,特别是在Web应用程序中。 - Raul Luna

4
仅仅打印堆栈跟踪是不够的。仅在异常发生时打印堆栈跟踪本身并不意味着它完全是不好的做法,但是仅仅打印堆栈跟踪是一个问题。
始终记录异常(使用良好的日志框架),但不要将它们暴露给最终用户。并确保仅在开发模式下显示堆栈跟踪。
我自己大多数情况下使用logger.log(Level.SEVERE, <exception>.getMessage(), <exception>);
当NetBeans建议您处理异常'用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(); 更好。

以下可能会有所帮助:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接