Apa kegunaan metode printStackTrace () di Java?

98

Saya akan melalui program soket. Di dalamnya, printStackTracedisebut IOExceptionobjek di blok tangkapan.
Apa printStackTrace()sebenarnya yang dilakukannya?

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

Saya tidak menyadari tujuannya. Untuk apa itu digunakan?

Venkat
sumber
47
Salah satu fitur paling kuat dalam IDE modern adalah kemampuan untuk mencari dokumentasi (disebut javadoc) untuk metode Java tertentu. Di Eclipse itu adalah Shift-F2 saat kursor ditempatkan pada nama metode printStackTrace.
Thorbjørn Ravn Andersen
2
Sepertinya Anda baru mengenal Java. Ini sesuatu untuk dibaca: today.java.net/article/2006/04/04/…
TJR
Anda juga bisa membaca kode printStackTrace () untuk melihat dengan tepat apa yang dilakukannya dan bagaimana cara melakukannya.
Peter Lawrey
1
Saya sering melihat pola ini di dalam blok tangkapan: e.printStackTrace(); System.exit(1); Di sini saya ingin mengajukan pertanyaan yang sama dengan OP, tetapi dengan nada yang berbeda: Apa sebenarnya tujuan dari ini? Tidakkah JRE secara otomatis mencetak stacktrace dan keluar, ketika pengecualian dilemparkan? Yaitu, sebenarnya tidak banyak "Penanganan Pengecualian" yang terjadi di sini, bukan ??
Owen
1
Ini juga umumnya merupakan ide yang sangat buruk , karena menekan pengecualian - sayangnya itulah yang sering disarankan secara otomatis oleh Eclipse dan IDE lainnya sebagai badan untuk blok tangkap, jadi ini digunakan jauh lebih sering daripada yang seharusnya.
dimo414

Jawaban:

100

Ini adalah metode pada Exceptioninstance yang mencetak jejak tumpukan dari instance tersebutSystem.err .

Ini adalah alat yang sangat sederhana, tetapi sangat berguna untuk mendiagnosis pengecualian. Ini memberi tahu Anda apa yang terjadi dan di mana dalam kode ini terjadi.

Berikut adalah contoh bagaimana itu dapat digunakan dalam praktik:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}
Joachim Sauer
sumber
2
Dan berkat pengecualian yang dicentang, ini mungkin konten # 1 dari catchblok :-)
Joey
3
@ Joey Orthrow new RuntimeException(e)
Bart van Heelom
3
namun ini dianggap praktik yang buruk karena tidak aman untuk thread. Gunakan pernyataan logger dan sertakan di sana.
Karidrgn
42

Saya agak penasaran tentang ini juga, jadi saya hanya mengumpulkan sedikit kode contoh di mana Anda dapat melihat apa yang dilakukannya:

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

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

Menelepon println(e):

java.lang.NullPointerException

Menelepon e.printStackTrace():

java.io.IOException
      at package.Test.main(Test.java:74)
Jens Bodal
sumber
Ini normal, dengan yang pertama Anda memanggil toString () dari kesalahan, dan yang kedua Anda meminta untuk mencetak semua stackTrace dari kesalahan tersebut. Itu 2 hal yang berbeda.
Jon
1
System.err.println(e);akan lebih sesuai.
roottraveller
14

Ini membantu untuk melacak pengecualian. Misalnya Anda menulis beberapa metode dalam program Anda dan salah satu metode Anda menyebabkan bug. Kemudian printstack akan membantu Anda mengidentifikasi metode mana yang menyebabkan bug. Stack akan membantu seperti ini:

Pertama metode utama Anda akan dipanggil dan dimasukkan ke tumpukan, kemudian metode kedua akan dipanggil dan dimasukkan ke tumpukan dalam urutan LIFO dan jika ada kesalahan terjadi di suatu tempat di dalam metode apa pun, tumpukan ini akan membantu mengidentifikasi metode itu.

yogesh pathak
sumber
11

printStackTrace()membantu pemrogram untuk memahami di mana masalah sebenarnya terjadi. printStacktrace()adalah metode kelas Throwabledari java.langpaket. Ini mencetak beberapa baris di konsol keluaran. Baris pertama terdiri dari beberapa string. Ini berisi nama sub-kelas Throwable & informasi paket. Dari baris kedua dan seterusnya, ini menjelaskan posisi kesalahan / nomor baris yang dimulai dengan at.

Baris terakhir selalu menjelaskan tujuan yang dipengaruhi oleh kesalahan / pengecualian. Baris kedua terakhir memberi tahu kita tentang baris berikutnya dalam tumpukan di mana kontrol berjalan setelah mendapatkan transfer dari nomor baris yang dijelaskan di baris terakhir. Kesalahan / pengecualian mewakili keluaran dalam bentuk tumpukan, yang dimasukkan ke dalam tumpukan dengan fillInStackTrace()metode Throwablekelas, yang dengan sendirinya mengisi detail transfer kontrol program ke dalam tumpukan eksekusi. Garis yang dimulai dengan at, tidak lain adalah nilai dari tumpukan eksekusi. Dengan cara ini pemrogram dapat memahami di bagian mana dalam kode masalah sebenarnya berada.

Seiring dengan printStackTrace()metodenya, ada baiknya untuk digunakan e.getmessage().

Ashish Gope
sumber
6

printStackTrace()mencetak lokasi di mana pengecualian terjadi dalam kode sumber, sehingga memungkinkan penulis yang menulis program untuk melihat apa yang salah. Tetapi karena ini menunjukkan masalah dalam kode sumber, pengguna yang mungkin atau mungkin tidak memiliki pengalaman pengkodean mungkin tidak dapat memahami apa yang salah, jadi jika program memungkinkan pengguna untuk mengirim pesan kesalahan ke penulis, pengguna mungkin tidak dapat memberikan data yang baik tentang apa yang salah.

Anda harus mempertimbangkan Logger.getLogger()metode ini, ini menawarkan fasilitas penanganan pengecualian (logging) yang lebih baik, dan selain itu printStackTrace()tanpa argumen dianggap usang dan HANYA digunakan untuk tujuan debugging, bukan untuk tampilan pengguna.

TheArchon
sumber
2

The printStackTrace()membantu programmer memahami di mana masalah yang sebenarnya terjadi. The printStackTrace()metode adalah anggota dari kelas Throwabledi java.langpaket.

Rasmi Ranja Choudhury
sumber
2

printStackTraceadalah metode Throwablekelas. Metode ini menampilkan pesan kesalahan di konsol; di mana kami mendapatkan pengecualian dalam kode sumber. Metode ini dapat digunakan dengan blok tangkapan dan mereka menjelaskan:

  1. Nama pengecualian.
  2. Deskripsi pengecualian.
  3. Lokasi pengecualian di kode sumber.

Tiga metode yang menjelaskan pengecualian pada konsol (di mana printStackTrace adalah salah satunya) adalah:

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

Contoh:

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());  
         }
    }
}
Bablu Mgc
sumber
1

printStackTrace () membantu pemrogram untuk memahami di mana masalah sebenarnya terjadi. Ini membantu untuk melacak pengecualian. itu adalah metode printStackTrace () dari kelas Throwable yang diwarisi oleh setiap kelas pengecualian. Metode ini mencetak pesan yang sama dari objek e dan juga nomor baris di mana pengecualian terjadi.

Berikut ini adalah contoh lain tumpukan cetak Exception di 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: Ini adalah Pengecualian baru di Java ... di ClassName.methodName (fileName: 5)

RohanMNirer
sumber
0

Apa kegunaan metode e.printStackTrace () di Java?

Nah, tujuan menggunakan metode ini e.printStackTrace();adalah untuk melihat apa sebenarnya yang salah.

Misalnya, kami ingin menangani pengecualian. Mari kita lihat Contoh berikut.

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

Saya telah menggunakan metode e.printStackTrace();untuk menunjukkan dengan tepat apa yang salah.

Pada outputnya, kita bisa melihat hasil sebagai berikut.

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)
Stephen Rauch
sumber
-1

Lihat gambar di sini

printStackTrace() memberi tahu di baris mana Anda mendapatkan kesalahan, mengapa Anda mendapatkan kesalahan.

Contoh:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
SS Tiwari
sumber