【问题标题】:What is the use of printStackTrace() method in Java?Java 中 printStackTrace() 方法的用途是什么?
【发布时间】:2011-02-03 08:38:05
【问题描述】:

我正在通过一个套接字程序。其中,printStackTrace 在 catch 块中的 IOException 对象上被调用。
printStackTrace() 究竟做了什么?

catch(IOException ioe)
{
    ioe.printStackTrace();
}

我不知道它的目的。它是干什么用的?

【问题讨论】:

  • 现代 IDE 中最强大的功能之一是能够查找给定 Java 方法的文档(称为 javadoc)。在 Eclipse 中,当光标放在 printStackTrace 方法名称上时,它是 Shift-F2。
  • 听起来您是 Java 新手。这里有一些东西要读:today.java.net/article/2006/04/04/…
  • 您还可以阅读 printStackTrace() 的代码,以准确了解它的作用以及它是如何做到的。
  • 我经常在 catch 块中看到这种模式:e.printStackTrace(); System.exit(1); 在这里,我想问与 OP 相同的问题,但以不同的方式:这究竟是什么目的?抛出异常时,JRE 不会自动打印堆栈跟踪并退出吗?也就是说,这里并没有太多的“异常处理”,对吧??
  • 它通常也是 very bad idea,因为它抑制了异常 - 不幸的是,它是 Eclipse 和其他 IDE 通常自动建议作为 catch 块的主体,所以它被使用 far i> 比应有的频率更高。

标签: java exception-handling printstacktrace


【解决方案1】:

这是Exception 实例上的一个方法,prints the stack trace of the instance to System.err

这是一个非常简单但非常有用的异常诊断工具。它会告诉您发生了什么以及发生在代码中的什么位置。

这是一个如何在实践中使用的示例:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}

请注意,在“严肃的生产代码”中,您通常不想这样做,原因有很多(例如 System.out 不太有用且不是线程安全的)。在这些情况下,您通常会使用一些日志框架,通过类似log.error("Error during frobnication", e); 的命令提供相同(或非常相似)的输出。

【讨论】:

  • 感谢检查异常,这可能是catch 块的#1 内容:-)
  • @Joey 或throw new RuntimeException(e)
  • 但是它被认为是不好的做法,因为它不是线程安全的。使用 logger 语句并将其包含在其中。
【解决方案2】:

printStackTrace() 帮助程序员了解实际问题发生在哪里。它有助于跟踪异常。 它是每个异常类继承的 Throwable 类的 printStackTrace() 方法。此方法打印 e 对象的相同消息以及发生异常的行号。

以下是Java中异常打印堆栈的另一个例子。

public class Demo {
   public static void main(String[] args) {
      try {
         ExceptionFunc();
      } catch(Throwable e) {
         e.printStackTrace();
      }
   }
   public static void ExceptionFunc() throws Throwable {
      Throwable t = new Throwable("This is new Exception in Java...");

      StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
      };
      t.setStackTrace(trace);
      throw t;
   }
}

java.lang.Throwable:这是 Java 中的新异常... 在 ClassName.methodName(fileName:5)

【讨论】:

    【解决方案3】:

    printStackTraceThrowable 类的一个方法。此方法在控制台中显示错误消息;我们在源代码中得到异常的地方。这些方法可以与 catch 块一起使用,它们描述:

    1. 异常名称。
    2. 异常说明。
    3. 异常在源代码中的位置。

    在控制台上描述异常的三个方法(其中 printStackTrace 是其中之一)是:

    1. printStackTrace()
    2. toString()
    3. getMessage()

    例子:

    public class BabluGope {
        public static void main(String[] args) {
            try {
                System.out.println(10/0);
             } catch (ArithmeticException e) {
                 e.printStackTrace();   
                 // System.err.println(e.toString());
                 //System.err.println(e.getMessage());  
             }
        }
    }
    

    【讨论】:

      【解决方案4】:

      printStackTrace() 帮助程序员了解实际问题发生在哪里。 printStacktrace()java.lang 包的 Throwable 类的方法。它在输出控制台中打印几行。 第一行由几个字符串组成。它包含 Throwable 子类的名称和包信息。 从第二行开始,它描述了以at 开头的错误位置/行号。

      最后一行总是描述受错误/异常影响的目的地。倒数第二行告诉我们堆栈中的下一行,在从最后一行中描述的行号进行传输后,控件将进入何处。错误/异常表示堆栈形式的输出,由Throwable 类的fillInStackTrace() 方法馈入堆栈,该方法本身将程序控制传输详细信息填充到执行堆栈中。以at 开头的行只是执行堆栈的值。 通过这种方式,程序员可以了解代码中的实际问题在哪里。

      printStackTrace() 方法一起使用e.getmessage() 是个好主意。

      【讨论】:

        【解决方案5】:

        printStackTrace() 打印源代码中发生异常的位置,从而让编写程序的作者看到哪里出了问题。但是由于它显示源代码中的问题,可能有或可能没有任何编码经验的用户可能无法理解出了什么问题,所以如果程序允许用户向作者发送错误消息,用户可能无法提供有关问题所在的良好数据。

        您应该考虑使用Logger.getLogger() 方法,它提供了更好的异常处理(日志记录)工具,此外,不带参数的printStackTrace() 被认为已过时,只能用于调试目的,不能用于用户显示。

        【讨论】:

          【解决方案6】:

          我也有点好奇,所以我只是整理了一个小示例代码,您可以在其中看到它在做什么:

          try {
              throw new NullPointerException();
          }
          catch (NullPointerException e) {
              System.out.println(e);
          }
          
          try {
              throw new IOException();
          }
          catch (IOException e) {
              e.printStackTrace();
          }
          System.exit(0);
          

          致电println(e):

          java.lang.NullPointerException

          致电e.printStackTrace()

          java.io.IOException
                at package.Test.main(Test.java:74)
          

          【讨论】:

          • 这是正常的,第一个调用错误的 toString(),第二个调用打印错误的所有 stackTrace。这是两个不同的东西。
          • System.err.println(e); 会更合适。
          【解决方案7】:

          printStackTrace() 帮助程序员了解实际问题发生在哪里。 printStackTrace() 方法是 java.lang 包中 Throwable 类的成员。

          【讨论】:

            【解决方案8】:

            Java中e.printStackTrace()方法有什么用?

            嗯,使用e.printStackTrace();这个方法的目的就是看看到底哪里错了。

            例如,我们要处理一个异常。我们来看看下面的例子。

            public class Main{
            
              public static void main(String[] args) {
            
                int a = 12;
                int b = 2;
            
                try {
                   int result = a / (b - 2);
                   System.out.println(result);
                }
            
                catch (Exception e)
                {
                   System.out.println("Error: " + e.getMessage());
                   e.printStackTrace();
                }
              }
            }
            

            我使用了e.printStackTrace(); 方法来准确显示问题所在。

            在输出中,我们可以看到以下结果。

            Error: / by zero
            
            java.lang.ArithmeticException: / by zero
            
              at Main.main(Main.java:10)
              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.lang.reflect.Method.invoke(Method.java:498)
              at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
            

            【讨论】:

              【解决方案9】:

              它有助于跟踪异常。例如,您正在程序中编写一些方法,而您的方法之一会导致错误。然后 printstack 将帮助您识别导致错误的方法。 Stack 将提供如下帮助:

              首先将调用您的 main 方法并将其插入堆栈,然后将调用第二个方法并按 LIFO 顺序插入堆栈,如果任何方法内部的某处发生任何错误,则此堆栈将有助于识别该方法。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-04-24
                • 2011-09-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多