Java Uncaught Exceptions <br /> ก่อนที่คุณจะเรียนรู้ที่จะจัดการกับข้อยกเว้นในโปรแกรมมันมีประโยชน์ที่จะดูว่าเกิดอะไรขึ้นถ้าคุณไม่จัดการกับพวกเขา แอปเพล็ตต่อไปนี้รวมถึงนิพจน์ที่จงใจทำให้เกิดข้อผิดพลาดที่ไม่มีการแบ่งเป็นศูนย์
คลาส Exc0 {โมฆะคงที่หลัก (สตริง args []) {int d = 0;
เมื่อระบบรันไทม์ Java ตรวจสอบสถานการณ์ที่หารด้วยศูนย์มันจะสร้างวัตถุข้อยกเว้นใหม่และโยนข้อยกเว้น สิ่งนี้ทำให้การดำเนินการของ Exc0 หยุดเนื่องจากเมื่อมีการโยนข้อยกเว้นจะต้องถูกจับโดยตัวจัดการข้อยกเว้นและดำเนินการทันที ในตัวอย่างนี้เราไม่ได้ให้ตัวจัดการข้อยกเว้นของเราเองดังนั้นข้อยกเว้นจะถูกจับโดยตัวจัดการเริ่มต้นของระบบรันไทม์ Java ข้อยกเว้นใด ๆ ที่โปรแกรมของคุณไม่ถูกจับได้ในที่สุดจะได้รับการจัดการโดยตัวจัดการเริ่มต้น ตัวจัดการเริ่มต้นจะแสดงสตริงที่อธิบายข้อยกเว้นพิมพ์ร่องรอยสแต็กซึ่งมีข้อยกเว้นเกิดขึ้นและยุติโปรแกรม
นี่คือเอาต์พุตที่สร้างขึ้นโดยล่าม Javajdk มาตรฐานเพื่อดำเนินการโปรแกรม:
java.lang.arithmeticexception: / โดยศูนย์ที่ exc0.main (exc0.java:4)
หมายเหตุว่าชื่อคลาส EXC0 ชื่อเมธอดหลักชื่อไฟล์ exc0.java และหมายเลขบรรทัด 4 รวมอยู่ในแทร็กการใช้งานสแต็กอย่างง่าย นอกจากนี้โปรดทราบว่าประเภทข้อยกเว้นที่ถูกโยนเป็นคลาสย่อยที่มีข้อยกเว้นที่เรียกว่า arithmeticexception ซึ่งอธิบายได้อย่างชัดเจนว่าวิธีการผิดพลาดประเภทใด อภิปรายในภายหลังในบทนี้ Java มีประเภทข้อยกเว้นในตัวหลายประเภทที่ตรงกับข้อผิดพลาดของรันไทม์ประเภทต่างๆที่อาจเกิดขึ้น
แทร็กสแต็กจะแสดงลำดับของการเรียกวิธีการที่ส่งผลให้เกิดข้อผิดพลาด ตัวอย่างเช่นนี่คือเวอร์ชันอื่นของโปรแกรมก่อนหน้านี้ที่แนะนำข้อผิดพลาดเดียวกัน แต่ข้อผิดพลาดถูกสร้างขึ้นในวิธีอื่นนอกเหนือจากวิธีการหลัก ():
คลาส Exc1 {โมฆะ subroutine แบบคงที่ () {int d = 0;
ผลลัพธ์แทร็กสแต็กของ Handler ข้อยกเว้นเริ่มต้นแสดงให้เห็นว่าการเรียกสแต็กทั้งหมดแสดงขึ้นอย่างไร:
java.lang.arithmeticexception: / โดยศูนย์ที่ exc1.subroutine (exc1.java:4) ที่ exc1.main (exc1.java:7)
อย่างที่คุณเห็นด้านล่างของสแต็กคือบรรทัดที่ 7 ของหลักซึ่งเรียกวิธีรูทีนย่อย () วิธีนี้ทำให้เกิดข้อยกเว้นในบรรทัด 4 สแต็กการโทรมีความสำคัญสำหรับการดีบักเนื่องจากระบุขั้นตอนที่แน่นอนที่นำไปสู่ข้อผิดพลาด
การทำรังของชวาลองงบ
คำสั่งลองสามารถซ้อนกันได้ นั่นคือคำสั่งลองสามารถอยู่ในบล็อกลองอีกครั้ง ทุกครั้งที่คุณป้อนคำสั่งลองใช้ข้อยกเว้นก่อนและหลังความสัมพันธ์จะถูกผลักดันลงบนสแต็ก หากคำสั่งลองภายในไม่มีตัวจัดการจับที่มีข้อยกเว้นพิเศษสแต็กจะปรากฏขึ้นและตัวจัดการจับของคำสั่งลองครั้งต่อไปจะตรวจสอบว่ามันตรงกับหรือไม่ กระบวนการนี้จะดำเนินต่อไปจนกว่าคำสั่งจับจะจับคู่สำเร็จหรือจนกว่าคำสั่งลองซ้อนทั้งหมดจะหมดลง หากไม่มีคำสั่งจับจับคู่ระบบรันไทม์ Java จะจัดการกับข้อยกเว้นนี้ นี่คือตัวอย่างของการใช้คำสั่งลองซ้อนกัน:
// ตัวอย่างของคำสั่งลองซ้อนกัน class nasttry {โมฆะคงที่สาธารณะหลัก (String args []) {ลอง {int a = args.length; Divide-by-zero exception Divide-by-Zero จะถูกสร้างขึ้นโดยรหัสต่อไปนี้ ข้อยกเว้น ou t -of-bounds e) {system.out.println ("ดัชนีอาร์เรย์นอกขอบเขต:" + e);}} catch (arithmeticexception e) {system.out.println ("หารด้วย 0:"
อย่างที่คุณเห็นโปรแกรมทำรังอีกครั้งในบล็อกในบล็อกเดียว โปรแกรมทำงานดังนี้: เมื่อคุณดำเนินการโปรแกรมโดยไม่มีพารามิเตอร์บรรทัดคำสั่งบล็อกการลองภายนอกจะสร้างข้อยกเว้นหารด้วยศูนย์ โปรแกรมจะดำเนินการภายใต้เงื่อนไขพารามิเตอร์บรรทัดคำสั่งและข้อผิดพลาดหารด้วยการลองบล็อกซ้อนกันส่งผลให้เกิดข้อผิดพลาดที่แบ่งแยกได้ เนื่องจากบล็อกด้านในไม่ตรงกับข้อยกเว้นนี้มันจะผ่านข้อยกเว้นไปยังบล็อกการลองด้านนอกซึ่งมีการประมวลผลข้อยกเว้น หากคุณดำเนินการโปรแกรมด้วยพารามิเตอร์บรรทัดคำสั่งสองตัวข้อยกเว้นขอบเขตอาร์เรย์จะถูกสร้างขึ้นโดยบล็อกลองภายใน ผลลัพธ์ต่อไปนี้แสดงให้เห็นแต่ละกรณี:
c:/> java nasttrydivide โดย 0: java.lang.arithmeticexception:/โดย zeroc:/> java nasttry onea = 1divide โดย 0: java.lang.arithmeticexception:/โดย Zeroc:/> java Nesttry One Twoa = 2array OF-bounds: java.lang.arrayIndexoutofboundsexception
เมื่อมีการโทรวิธีการทำรังของคำสั่งลองสามารถเกิดขึ้นได้อย่างลับๆ ตัวอย่างเช่นคุณสามารถโทรไปยังวิธีการในบล็อกลอง ภายในวิธีนี้มีคำสั่งลองอีกครั้ง ในกรณีนี้การลองในวิธีการยังคงซ้อนอยู่ในบล็อกลองที่เรียกวิธีการภายนอก ต่อไปนี้คือการปรับเปลี่ยนตัวอย่างก่อนหน้าและบล็อกลองซ้อนจะถูกย้ายไปที่ด้านในของวิธีการ Nasttry ():
/* คำสั่งลองสามารถซ้อนกันโดยปริยายผ่านการโทรไปยังวิธีการ -ข้อยกเว้นเป็นศูนย์จะถูกสร้างขึ้นโดยรหัสต่อไปนี้ ข้อยกเว้น F- ขอบเขต .OUT .PRINTLN ("ดัชนีอาร์เรย์นอกขอบเขต:" + E); ก่อนที่จะส่งคำสั่งต่อไปนี้จะสร้างข้อยกเว้นแบบแบ่งแยกโดยศูนย์ ) {ระบบ
ผลลัพธ์ของโปรแกรมนี้เหมือนกับในตัวอย่างก่อนหน้า