1. طرق طباعة مسارات مكدس
استدعاء بنشاط أحد printstacktrace () = printstacktrace (System.err) ، PrintStackTrace (printstream) ، و printstacktrace (printwriter).
إذا لم تتم معالجة استثناء ، فسيتم استدعاء طريقة استثناء PrintStackTrace () قبل خروج البرنامج ، وفي النهاية استثناء في مؤشر الترابط "الرئيسي" + printstacktrace ()
2. مسار المكدس
1. printstacktrace ()
بادئ ذي بدء ، من الضروري توضيح أن هذه الطريقة لا تأتي من فئة الاستثناء. باستثناء تحديد العديد من المنشئين ، يتم توريث جميع الأساليب من فئة الوالدين. ترث الطرق المتعلقة بالاستثناءات من فئة Java.lang.Throwable. PrintStackTrace () هو واحد منهم.
تقوم هذه الطريقة بطباعة معلومات مسار المكدس للكائن القابل للتسمية إلى دفق إخراج الخطأ القياسي. يبدو الناتج مثل هذا:
java.lang.nullpointerxception في myclass.mash (myclass.java:9) في myclass.crunch (myclass.java:6) في myclass.main (myclass.java:3)
السطر الأول من الإخراج هو إخراج طريقة TOSTRING (). سنتحدث عن هذه الطريقة لاحقًا.
لنرى مثالًا أدناه:
فئة TestPrintStacktrace {public static void f () {رمي استثناء جديد ("هناك شيء خاطئ!") ؛ ) {try {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 () للوصول إلى عناصر مكدس المسار هذه وطباعة الإخراج:
فئة TestPrintStacktrace {public static void f () {رمي استثناء جديد ("هناك شيء خاطئ!") ؛ ) {try {g () ؛ ------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------------------------------ ------- -") ؛ لـ (stackTraceElement elem: e.getStackTrace ()) {system.out.println (elem) ؛}}}}هذا الإخراج هو في الأساس نفس إخراج printstacktrace () ، على النحو التالي:
java.lang.exception: حدث خطأ ما! at TestPrintStackTrace.f(TestPrintStackTrace.java:3) at TestPrintStackTrace.g(TestPrintStackTrace.java:6) at TestPrintStackTrace.main(TestPrintStack Trace.java:10)TestPrintStackTrace.f(TestPrintStackTrace.java:3)TestPrintStackTrace.g(TestPrintStackTrace. Java: 6) TestPrintStackTrace.Main (TestPrintStackTrace.java:10)
ثلاثة
ستعود طريقة FillInstackTrace () الأصلية إلى كائن قابل للارتفاع ، والذي يتم إنشاؤه عن طريق ملء معلومات مكدس المكالمات الحالية في كائن الاستثناء الأصلي ، لذلك لا يزال الاستثناء الأصلي الذي تم إرجاعه هو الاستثناء الأصلي.
سيصبح الخط الذي يدعو هذه الطريقة هو موقع جديد ، وسيتم فقد معلومات حول نقطة حدث الاستثناء الأصلية. تأثيره يعادل التقاط استثناء وإعادة تربية استثناء آخر. الفرق بين الاثنين هو أن الاستثناء بعد FillInstacktrace لا يزال الاستثناء الأصلي (يفتقر إلى مسار المكدس) ؛ .
حزمة com.jyz.study.jdk.exception ؛ ) ؛ اختبار الفراغ الثابت 2 () {test3 () ؛ يظهر في الشكل: معلومات مكدس الاستثناء من 1 و 2:
الفرق هو معلومات هذا نفسه.
1 معلومات المكدس
استثناء في الموضوع "الرئيسي" java.lang.nullpointerxception: str is null at com.jyz.study.jdk.exception.fillinstacktrace.test1 (FillInstacktrace.java:2 0) في com.jyz.study.jdk.exception.fillinstacktrace. MAIN (FILLINSTACKTRACE.JAVA:13)
2 معلومات المكدس
استثناء في الموضوع "الرئيسي" java.lang.exception في com.jyz.study.jdk.exception.fillinstacktrace.test1 (fillinstacktrace.java:21) في com.jyz.study.jdk. : 13)