¿Cuál es el uso del método printStackTrace () en Java?


97

Estoy pasando por un programa de socket. En él, printStackTracese llama al IOExceptionobjeto en el bloque de captura.
¿Qué hace printStackTrace()realmente?

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

Desconozco su propósito. ¿Para qué se usa esto?


47
Una de las características más poderosas de los IDE modernos es la capacidad de buscar documentación (llamada javadoc) para un método Java dado. En Eclipse es Shift-F2 cuando el cursor se coloca en el nombre del método printStackTrace.
Thorbjørn Ravn Andersen

2
Parece que eres nuevo en Java. Aquí hay algo para leer: today.java.net/article/2006/04/04/…
TJR

También puede leer el código de printStackTrace () para ver exactamente qué hace y cómo lo hace.
Peter Lawrey

1
A menudo veo este patrón dentro de los bloques de captura: e.printStackTrace(); System.exit(1); aquí quiero hacer la misma pregunta que el OP, pero en una línea diferente: ¿Cuál es exactamente el propósito de esto? ¿No imprimirá el JRE automáticamente el seguimiento de la pila y se cerrará cuando se lance la excepción? Es decir, no hay mucho "Manejo de excepciones" aquí, ¿verdad?
Owen

1
En general, también es una muy mala idea , ya que suprime la excepción; desafortunadamente, es lo que Eclipse y otros IDE a menudo sugieren automáticamente como el cuerpo del bloque de captura, por lo que se usa con mucha más frecuencia de lo que debería.
dimo414

Respuestas:


99

Es un método en Exceptioninstancias que imprime el seguimiento de pila de la instancia enSystem.err .

Es una herramienta muy simple pero muy útil para diagnosticar excepciones. Le dice lo que sucedió y en qué parte del código sucedió esto.

A continuación, se muestra un ejemplo de cómo podría usarse en la práctica:

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

2
Y gracias a las excepciones marcadas, probablemente sea el contenido número uno de los catchbloques :-)
Joey

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

3
sin embargo, se considera una mala práctica ya que no es seguro para subprocesos. Utilice la declaración del registrador e inclúyala allí.
Karidrgn

40

También tenía un poco de curiosidad acerca de esto, así que reuní un pequeño código de muestra donde puedes ver lo que está haciendo:

try {
    throw new NullPointerException();
}
catch (NullPointerException e) {
    System.out.println(e);
}

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

Llamando println(e):

java.lang.NullPointerException

Llamando e.printStackTrace():

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

Esto es normal, con el primero se llama al toString () del error, y en el segundo se solicita imprimir todo el stackTrace del error. Eso es 2 cosas diferentes.
Jon

1
System.err.println(e);será más apropiado.
roottraveller

14

Ayuda a rastrear la excepción. Por ejemplo, está escribiendo algunos métodos en su programa y uno de sus métodos causa un error. Luego, printstack te ayudará a identificar qué método causa el error. Stack ayudará así:

Primero se llamará e insertará su método principal en la pila, luego se llamará e insertará el segundo método en la pila en orden LIFO y si ocurre algún error en algún lugar dentro de cualquier método, esta pila ayudará a identificar ese método.


11

printStackTrace()ayuda al programador a comprender dónde ocurrió el problema real. printStacktrace()es un método de la clase Throwablede java.langpaquete. Imprime varias líneas en la consola de salida. La primera línea consta de varias cadenas. Contiene el nombre de la subclase Throwable y la información del paquete. A partir de la segunda línea, describe la posición de error / número de línea que comienza conat .

La última línea siempre describe el destino afectado por el error / excepción. La penúltima línea nos informa sobre la siguiente línea de la pila a la que va el control después de obtener la transferencia del número de línea descrito en la última línea. Los errores / excepciones representan la salida en forma de pila, que se introdujeron en la pila por fillInStackTrace()método de Throwableclase, que a su vez completa los detalles de transferencia de control del programa en la pila de ejecución. Las líneas que comienzan con at, no son más que los valores de la pila de ejecución. De esta manera, el programador puede comprender en qué parte del código se encuentra el problema real.

Junto con el printStackTrace()método, es una buena idea utilizar e.getmessage().


6

printStackTrace()imprime las ubicaciones donde ocurrió la excepción en el código fuente, lo que permite al autor que escribió el programa ver qué salió mal. Pero dado que muestra problemas en el código fuente, los usuarios que pueden tener o no experiencia en codificación pueden no ser capaces de entender qué salió mal, por lo que si el programa permite al usuario enviar mensajes de error a los autores, el Es posible que los usuarios no puedan proporcionar datos fiables sobre lo que salió mal.

Debe considerar el Logger.getLogger()método, ofrece una mejor facilidad de manejo de excepciones (registro) y, además, printStackTrace()sin argumentos se considera obsoleto y SOLO debe usarse con fines de depuración, no para la visualización del usuario.


2

La printStackTrace()ayuda al programador a entender dónde se produjo el problema real. El printStackTrace()método es un miembro de la clase Throwabledel java.langpaquete.


2

printStackTracees un método de la Throwableclase. Este método muestra un mensaje de error en la consola; donde obtenemos la excepción en el código fuente. Estos métodos se pueden utilizar con el bloque de captura y describen:

  1. Nombre de la excepción.
  2. Descripción de la excepción.
  3. Ubicación de la excepción en el código fuente.

Los tres métodos que describen la excepción en la consola (en la que printStackTrace es uno de ellos) son:

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

Ejemplo:

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 () ayuda al programador a comprender dónde ocurrió el problema real. Ayuda a rastrear la excepción. es el método printStackTrace () de la clase Throwable heredado por cada clase de excepción. Este método imprime el mismo mensaje del objeto e y también el número de línea donde ocurrió la excepción.

El siguiente es otro ejemplo de pila de impresión de la excepción en 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: esta es una nueva excepción en Java ... en ClassName.methodName (fileName: 5)


0

¿Cuál es el uso del método e.printStackTrace () en Java?

Bueno, el propósito de usar este método e.printStackTrace();es ver qué es exactamente lo que está mal.

Por ejemplo, queremos manejar una excepción. Echemos un vistazo al siguiente ejemplo.

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

He usado el método e.printStackTrace(); para mostrar exactamente lo que está mal.

En la salida, podemos ver el siguiente resultado.

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

Ver imagen aquí

printStackTrace() indica en qué línea está obteniendo un error y por qué está obteniendo un error.

Ejemplo:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.