105

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

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

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

4

9 回答 9

104

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

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

以下是如何在实践中使用它的示例:

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

请注意,在“严肃的生产代码”中,您通常不希望这样做,原因有多种(例如System.out不太有用且不是线程安全的)。在这些情况下,您通常会使用一些日志框架,该框架使用类似log.error("Error during frobnication", e);.

于 2010-04-01T12:47:38.117 回答
45

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

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)
于 2014-02-14T19:43:06.633 回答
14

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

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

于 2012-04-23T11:24:17.420 回答
11

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

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

除了printStackTrace()方法,使用e.getmessage().

于 2015-08-01T16:42:45.557 回答
6

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

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

于 2015-05-28T03:10:49.357 回答
2

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

于 2017-06-30T18:25:38.940 回答
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());  
         }
    }
}
于 2017-07-12T20:47:28.020 回答
1

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)

于 2018-10-25T14:29:45.357 回答
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)
于 2017-02-26T00:16:08.427 回答