2011-08-18 89 views
52

这可能是一个新手问题,但希望你能帮助我。 :)我有这样的事情:在Java中使用e.printStackTrace()

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

我使用NetBeans IDE和由于某些原因的printStackTrace以波浪线下划线。当我按下Alt + Enter时,它说Throwable.printStackTrace()应该被删除。这是什么意思?任何人都可以提供更多的见解,这可能意味着什么或者我可以忽略这个?

谢谢!

回答

20

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

+0

使用像log4j这样的日志框架就是这样一种更好的方法。 – svarog

36

尝试:

e.printStackTrace(System.out); 
+0

啊,谢谢@Pablo!疯狂,为什么这会使警告完全消失?如果您不指定'System.out'作为参数并将其保留为空,则JVM是否采用其“调试模式命令并仅输出到控制台? –

+6

黑客!这并不能真正解决问题,因为它只是阻止Netbeans显示它。这仍将输出到默认的错误流。 – ThePerson

+0

@ThePerson'System.err'将打印到默认的错误流,而不是'System.out'。 'System.out'表示默认的输出流。 – cst1992

14

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

9

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'。 –

+2

并不总是一个好习惯。该控制台可能是您无法访问的Web服务器中的控制台。有时候最好将这个堆栈跟踪转储到应用程序的当前日志中,特别是在Web应用程序中。 –

1

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

总是记录异常(使用良好的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();更好。

这些可能帮助:

0
e.printStackTrace(System.err); 

工作对我来说