การใช้ printStackTrace () method ใน Java คืออะไร?


99

ฉันกำลังผ่านโปรแกรมซ็อกเก็ต ในนั้นprintStackTraceเรียกว่าIOExceptionวัตถุในบล็อกจับ
ทำอะไรได้printStackTrace()จริง?

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

ฉันไม่รู้จุดประสงค์ของมัน ใช้ทำอะไร?


47
หนึ่งในคุณสมบัติที่ทรงพลังที่สุดใน IDE สมัยใหม่คือความสามารถในการค้นหาเอกสาร (เรียกว่า javadoc) สำหรับวิธีการ Java ใน Eclipse จะเป็น Shift-F2 เมื่อวางเคอร์เซอร์บนชื่อเมธอด printStackTrace
Thorbjørn Ravn Andersen

2
ดูเหมือนว่าคุณยังใหม่กับ Java นี่คือสิ่งที่ต้องอ่าน: today.java.net/article/2006/04/04/…
TJR

คุณยังสามารถอ่านโค้ดของ printStackTrace () เพื่อดูว่ามันทำอะไรและทำงานอย่างไร
Peter Lawrey

1
ฉันมักจะเห็นรูปแบบนี้ในบล็อกจับ: ที่e.printStackTrace(); System.exit(1); นี่ฉันต้องการถามคำถามเดียวกันกับ OP แต่ในหลอดเลือดดำอื่น: จุดประสงค์ของสิ่งนี้คืออะไร? JRE จะไม่พิมพ์ stacktrace โดยอัตโนมัติและออกเมื่อเกิดข้อยกเว้นหรือไม่? คือไม่มี "Exception Handling" เกิดขึ้นมากนักใช่ไหม ??
Owen

1
นอกจากนี้ยังมักจะคิดที่ดีมากในขณะที่มันยับยั้งการยกเว้น - น่าเสียดายที่มันเป็นสิ่งที่ทำให้เกิดคราสและ IDEs อื่น ๆ มักจะแนะนำให้อัตโนมัติในขณะที่ร่างกายสำหรับการป้องกันการจับเพื่อให้มันใช้ไกลบ่อยกว่าที่ควรจะเป็น
dimo414

คำตอบ:


100

มันเป็นวิธีการในExceptionกรณีที่พิมพ์ร่องรอยสแต็คของอินสแตนซ์System.err

เป็นเครื่องมือที่เรียบง่าย แต่มีประโยชน์มากสำหรับการวินิจฉัยข้อยกเว้น จะบอกคุณว่าเกิดอะไรขึ้นและเกิดขึ้นที่ไหนในโค้ด

นี่คือตัวอย่างของวิธีการใช้ในทางปฏิบัติ:

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

2
และขอบคุณที่ตรวจสอบข้อยกเว้นอาจเป็นเนื้อหาอันดับ 1 ของcatchบล็อก :-)
Joey

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

3
อย่างไรก็ตามถือเป็นการปฏิบัติที่ไม่ดีเนื่องจากไม่ปลอดภัย ใช้คำสั่งคนตัดไม้และรวมไว้ที่นั่น
Karidrgn

42

ฉันก็อยากรู้เกี่ยวกับเรื่องนี้เช่นกันดังนั้นฉันจึงรวบรวมโค้ดตัวอย่างเล็กน้อยเพื่อให้คุณเห็นว่ามันทำอะไร:

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 () ของข้อผิดพลาดและในครั้งที่ 2 คุณขอให้พิมพ์ stackTrace ทั้งหมดจากข้อผิดพลาด นั่นคือ 2 สิ่งที่แตกต่างกัน
จอน

1
System.err.println(e);จะเหมาะสมกว่า
roottraveller

14

ช่วยในการติดตามข้อยกเว้น ตัวอย่างเช่นคุณกำลังเขียนวิธีการบางอย่างในโปรแกรมของคุณและหนึ่งในวิธีของคุณทำให้เกิดข้อผิดพลาด จากนั้น printstack จะช่วยคุณระบุว่าวิธีใดทำให้เกิดข้อบกพร่อง Stack จะช่วยได้ดังนี้:

ขั้นแรกวิธีการหลักของคุณจะถูกเรียกและแทรกลงในสแต็กจากนั้นวิธีที่สองจะถูกเรียกและแทรกลงในสแต็กตามลำดับ LIFO และหากมีข้อผิดพลาดเกิดขึ้นที่ใดที่หนึ่งภายในวิธีใด ๆ สแต็กนี้จะช่วยระบุวิธีการนั้น


11

printStackTrace()ช่วยให้โปรแกรมเมอร์เข้าใจว่าปัญหาเกิดขึ้นที่ใด printStacktrace()เป็นวิธีการหนึ่งของคลาสThrowableของjava.langแพ็คเกจ มันพิมพ์หลายบรรทัดในคอนโซลเอาต์พุต บรรทัดแรกประกอบด้วยหลายสตริง ประกอบด้วยชื่อของคลาสย่อย Throwable และข้อมูลแพ็คเกจ จากบรรทัดที่สองเป็นต้นไปจะอธิบายจำนวนตำแหน่งที่ผิดพลาด / atสายเริ่มต้นด้วย

บรรทัดสุดท้ายจะอธิบายปลายทางที่ได้รับผลกระทบจากข้อผิดพลาด / ข้อยกเว้นเสมอ บรรทัดสุดท้ายที่สองแจ้งให้เราทราบเกี่ยวกับบรรทัดถัดไปในสแต็กที่การควบคุมไปหลังจากได้รับการถ่ายโอนจากหมายเลขบรรทัดที่อธิบายไว้ในบรรทัดสุดท้าย ข้อผิดพลาด / ข้อยกเว้นแสดงถึงเอาต์พุตในรูปแบบสแต็กซึ่งถูกป้อนเข้าในสแต็กโดยfillInStackTrace()วิธีการของThrowableคลาสซึ่งจะกรอกรายละเอียดการถ่ายโอนการควบคุมโปรแกรมลงในกองการดำเนินการ บรรทัดที่ขึ้นต้นด้วยatไม่มีอะไรนอกจากค่าของสแต็กการดำเนินการ ด้วยวิธีนี้โปรแกรมเมอร์สามารถเข้าใจได้ว่าปัญหาที่แท้จริงอยู่ที่ใดในโค้ด

พร้อมกับวิธีการมันเป็นความคิดที่ดีที่จะใช้printStackTrace()e.getmessage()


6

printStackTrace()พิมพ์ตำแหน่งที่มีข้อยกเว้นเกิดขึ้นในซอร์สโค้ดซึ่งทำให้ผู้เขียนที่เขียนโปรแกรมเห็นสิ่งที่ผิดพลาด แต่เนื่องจากมันแสดงปัญหาในซอร์สโค้ดผู้ใช้ที่อาจมีหรือไม่มีประสบการณ์ในการเขียนโค้ดอาจไม่สามารถเข้าใจสิ่งที่ผิดพลาดได้ดังนั้นหากโปรแกรมอนุญาตให้ผู้ใช้ส่งข้อความแสดงข้อผิดพลาดไปยังผู้เขียน ผู้ใช้อาจไม่สามารถให้ข้อมูลที่ดีเกี่ยวกับสิ่งที่ผิดพลาดได้

คุณควรพิจารณาLogger.getLogger()วิธีการนี้ซึ่งมีสิ่งอำนวยความสะดวกในการจัดการข้อยกเว้น (การบันทึก) ที่ดีกว่าและนอกจากนี้การprintStackTrace()ไม่มีข้อโต้แย้งถือว่าล้าสมัยและควรใช้เพื่อวัตถุประสงค์ในการดีบักเท่านั้นไม่ใช่สำหรับการแสดงผลของผู้ใช้


2

printStackTrace()ช่วยให้โปรแกรมเมอร์เข้าใจว่าปัญหาที่เกิดขึ้นจริงที่เกิดขึ้น printStackTrace()วิธีการเป็นสมาชิกของชั้นเรียนThrowableในjava.langแพคเกจ


2

printStackTraceเป็นวิธีการหนึ่งของThrowableคลาส วิธีนี้แสดงข้อความแสดงข้อผิดพลาดในคอนโซล ที่เราได้รับข้อยกเว้นในซอร์สโค้ด วิธีการเหล่านี้สามารถใช้ได้กับ catch block และอธิบาย:

  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 () ช่วยให้โปรแกรมเมอร์เข้าใจว่าปัญหาเกิดขึ้นจริงที่ใด ช่วยในการติดตามข้อยกเว้น เป็นเมธอด printStackTrace () ของคลาส Throwable ที่สืบทอดมาจากคลาสยกเว้นทุกคลาส วิธีนี้จะพิมพ์ข้อความเดียวกันของวัตถุ e ​​และหมายเลขบรรทัดที่เกิดข้อยกเว้น

ต่อไปนี้เป็นอีกตัวอย่างหนึ่งของ print stack ของ Exception ใน 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: นี่คือ Exception ใหม่ใน Java ... ที่ ClassName.methodName (fileName: 5)


0

การใช้ e.printStackTrace () method ใน Java คืออะไร?

จุดประสงค์ของการใช้วิธีนี้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) 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.