1. วิธีการพิมพ์แทร็กสแต็ก
เรียกอย่างใดอย่างหนึ่งในหนึ่งในวัตถุที่สามารถขยายได้ของ PrintStackTrace () = PrintStackTrace (System.err), PrintStackTrace (PrintStream) และ PrintStackTrace (PrintWriter)
หากข้อยกเว้นไม่ได้ดำเนินการให้พ่นโดยตรงหลังจากวิธีหลักวิธีการ printstacktrace () ข้อยกเว้นจะถูกเรียกก่อนที่โปรแกรมจะออกและในที่สุดก็มีข้อยกเว้นในเธรด "Main" + PrintStackTrace ()
2. แทร็กสแต็ค
1. PrintStackTrace ()
ก่อนอื่นจำเป็นต้องชี้แจงว่าวิธีนี้ไม่ได้มาจากคลาสข้อยกเว้น ยกเว้นการกำหนดตัวสร้างหลายวิธีวิธีการทั้งหมดได้รับการสืบทอดจากชั้นเรียนหลักของพวกเขา วิธีการที่เกี่ยวข้องกับข้อยกเว้นนั้นสืบทอดมาจาก Java.lang คลาสที่น่าเชื่อถือ PrintStackTrace () เป็นหนึ่งในนั้น
วิธีนี้พิมพ์ข้อมูลแทร็กสแต็กของวัตถุที่สามารถขยายได้ไปยังสตรีมเอาต์พุตข้อผิดพลาดมาตรฐาน ผลลัพธ์มีลักษณะเช่นนี้:
java.lang.nullpointerexception ที่ myclass.mash (myclass.java:9) ที่ myclass.crunch (myclass.java:6) ที่ myclass.main (myclass.java:3)
บรรทัดแรกของเอาต์พุตคือเอาต์พุตของวิธี ToString () เราจะพูดถึงวิธีนี้ในภายหลัง
มาดูตัวอย่างด้านล่าง:
Public Class TestPrintStackTrace {โมฆะคงที่ f () โยนข้อยกเว้น {โยนข้อยกเว้นใหม่ ("มีบางอย่างผิดปกติ!"); ) {ลอง {g ();ผลลัพธ์ของตัวอย่างนี้มีดังนี้:
java.lang.exception: มีบางอย่างผิดปกติ! ที่ testprintstacktrace.f (testprintstacktrace.java:3) ที่ testprintstacktrace.g (testprintstacktrace.java:6) ที่ testprintstacktrace.main (testprintstack trace.java:10)
ในตัวอย่างนี้มีข้อยกเว้นถูกโยนลงไปในเมธอด f () วิธี F () เรียกว่าในเมธอด g () ข้อยกเว้นจะถูกจับในวิธีการหลักและพิมพ์ข้อมูลแทร็กสแต็ก ดังนั้นผลลัพธ์จะแสดงกระบวนการของ f -> g -> หลักในทางกลับกัน
2. วิธี getStackTrace ()
วิธีนี้ให้การเข้าถึงโปรแกรมที่พิมพ์โดยวิธี PrintStackTrace () มันส่งคืนอาร์เรย์ขององค์ประกอบแทร็กสแต็ก เอาต์พุตข้างต้นเป็นตัวอย่าง บันทึกองค์ประกอบแทร็กสแต็กเหล่านี้ในอาร์เรย์ แต่ละองค์ประกอบสอดคล้องกับกรอบสแต็ก องค์ประกอบแรกของอาร์เรย์บันทึกองค์ประกอบด้านบนของสแต็กซึ่งเป็น F ด้านบน องค์ประกอบด้านล่างขององค์ประกอบสุดท้ายที่บันทึกไว้
นี่คือตัวอย่างของการใช้ getStackTrace () เพื่อเข้าถึงองค์ประกอบสแต็กแทร็กเหล่านี้และพิมพ์เอาต์พุต:
Public Class TestPrintStackTrace {โมฆะคงที่ f () โยนข้อยกเว้น {โยนข้อยกเว้นใหม่ ("มีบางอย่างผิดปกติ!"); ) {ลอง {g (); ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ---------------------------------------- ------ ------ ------ -"); สำหรับ (stacktracelement elem: e.getstacktrace ()) {system.out.println (elem);}}}}}เอาต์พุตดังกล่าวโดยทั่วไปเหมือนกับเอาต์พุตของ PrintStackTrace () ดังนี้:
java.lang.exception: มีบางอย่างผิดปกติ! ที่ testprintstacktrace.f (testprintstacktrace.java:3) ที่ testprintstacktrace.g (testprintstacktrace.java:6) ที่ testprintstacktrace.main (testprintstack trace.java:10) Java: 6) TestPrintStackTrace.Main (TestPrintStackTrace.java:10)
สามวิธี FillinstackTrace
วิธีการ FillinStackTrace () ดั้งเดิมจะส่งคืนวัตถุที่สามารถหมุนได้ซึ่งถูกสร้างขึ้นโดยการกรอกข้อมูลสแต็กการโทรปัจจุบันลงในวัตถุข้อยกเว้นดั้งเดิมดังนั้นข้อยกเว้นเดิมที่ส่งคืนยังคงเป็นข้อยกเว้นเดิม
บรรทัดที่เรียกวิธีนี้จะกลายเป็นสถานที่ใหม่ข้อยกเว้นและข้อมูลเกี่ยวกับจุดเกิดข้อยกเว้นเดิมจะหายไป ผลกระทบของมันเทียบเท่ากับการจับข้อยกเว้นและโยนข้อยกเว้นอีกครั้ง ความแตกต่างระหว่างทั้งสองคือข้อยกเว้นหลังจาก FillinstackTrace ยังคงเป็นข้อยกเว้นเดิม (เพียงแค่ขาดสแต็กแทร็ก); .
แพ็คเกจ com.jyz.study.jdk.exception; ); โมฆะคงที่ test2 () {test3 (); ข้อมูลสแต็กข้อยกเว้นของ 1 และ 2 แสดงในรูป:
ความแตกต่างคือข้อมูลของตัวเอง
ข้อมูลสแต็กของ 1
ข้อยกเว้นในเธรด "Main" java.lang.nullpointerexception: str เป็น null ที่ com.jyz.study.jdk.exception.fillinstacktrace.test1 (fillinstacktrace.java:2 0) ที่ com.jyz.study.jdk.exception.fillinstacktrace หลัก (Fillinstacktrace.java:13)
2 ข้อมูลสแต็ก
ข้อยกเว้นในเธรด "หลัก" java.lang.exception ที่ com.jyz.study.jdk.exception.fillinstacktrace.test1 (Fillinstacktrace.java:21) ที่ com.jyz.study.jdk. : 13)