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


97

我正在通过一个套接字程序。在其中,在catch块中printStackTraceIOException对象上调用。
什么是printStackTrace()真正做到?

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

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


47
现代IDE中最强大的功能之一就是能够查找给定Java方法的文档(称为javadoc)。在Eclipse中,将光标置于printStackTrace方法名称上时为Shift-F2。
托尔比约恩Ravn的安徒生

2
听起来您是Java的新手。这是要读的东西:today.java.net/article/2006/04/04/…–
TJR

您还可以阅读printStackTrace()的代码,以确切地了解它的作用和作用。
彼得·劳瑞

1
我经常在catch块中看到这种模式:e.printStackTrace(); System.exit(1); 在这里,我想问的是与OP相同的问题,但又有不同的说法:这到底是什么目的?引发异常时,JRE不会自动打印堆栈跟踪并退出吗?即,这里实际上没有发生太多的“异常处理”,对吧?
Owen

1
通常,这也是一个非常糟糕的主意,因为它抑制了异常-不幸的是,这是Eclipse和其他IDE经常自动建议的catch块主体,因此它的使用频率远远超过了应有的水平。
dimo414 '17

Answers:


99

这是Exception实例上的一种方法,可将实例的堆栈跟踪打印到System.err

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

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

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

2
还要感谢检查的异常,它可能是代码catch块的#1内容:-)
Joey 2010年

3
@Joey Orthrow new RuntimeException(e)
Bart van Heukelom

3
但是,由于它不是线程安全的,因此被认为是不好的做法。使用logger语句并将其包含在其中。
Karidrgn

40

我也对此感到很好奇,所以我只整理了一些示例代码,您可以在其中查看其功能:

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。那是两件事。
2016年

1
System.err.println(e);会更合适。
roottraveller

14

它有助于跟踪异常。例如,您正在程序中编写某些方法,而其中一种方法会导致错误。然后,printstack将帮助您确定导致该错误的方法。堆栈将像这样:

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


11

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

最后一行始终描述受错误/异常影响的目的地。从倒数第二行中描述的行号转移过来后,控件转到堆栈后的第二行。错误/异常以堆栈的形式表示输出,通过类的fillInStackTrace()方法将其馈入堆栈,Throwable该类本身将程序控制传递细节填充到执行堆栈中。以开头的行at不过是执行堆栈的值。这样,程序员可以了解实际问题在代码中的何处。

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


6

printStackTrace()打印源代码中发生异常的位置,从而使编写程序的作者可以查看出了什么问题。但是由于它在源代码中显示出问题,因此可能有或没有任何编码经验的用户可能无法理解出了什么问题,因此,如果该程序允许用户将错误消息发送给作者,则用户可能无法提供正确的错误数据。

您应该考虑该Logger.getLogger()方法,它提供了更好的异常处理(日志记录)功能,并且除了printStackTrace()没有参数外,该方法被认为已经过时了,仅应用于调试目的,而不是用于用户显示。



2

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());  
         }
    }
}

1

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

以下是Java中Exception的打印堆栈的另一个示例。

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)


0

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)

-1

在这里查看图片

printStackTrace() 告诉您哪里出错了,为什么会出错。

例:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.