บล็อกลองซ้อนกันใน Java
ใน Java คำสั่ง try สามารถอยู่ในบล็อกของการลองอื่นได้ มันถูกเรียกว่าเป็นบล็อกลองที่ซ้อนกัน ทุกครั้งที่ป้อนคำสั่ง try บริบทของข้อยกเว้นนั้นจะถูกพุชบนสแต็ก
เหตุใดจึงใช้บล็อกลองที่ซ้อนกัน
บางครั้งสถานการณ์อาจเกิดขึ้นที่ส่วนหนึ่งของบล็อกอาจทำให้เกิดข้อผิดพลาดหนึ่งรายการ และทั้งบล็อกเองอาจทำให้เกิดข้อผิดพลาดอื่น ในกรณีเช่นนี้ ตัวจัดการข้อยกเว้นจะต้องซ้อนกัน
ไวยากรณ์
try {
statement 1;
statement 2;
try {
statement 1;
statement 2;
}
catch(Exception e) {
// catch the corresponding exception
}
}
catch(Exception e) {
// catch the corresponding exception
}
.............
// An example of nested try statements.
class NestTry {
public static void main(String args[]) {
try {
int a = args.length;
/* If no command-line args are present,
the following statement will generate
a divide-by-zero exception. */
int b = 42 / a;
System.out.println("a = " + a);
try { // nested try block
/* If one command-line arg is used,
then a divide-by-zero exception
will be generated by the following code. */
if(a==1) a = a/(a-a); // division by zero
/* If two command-line args are used,
then generate an out-of-bounds exception. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // generate an out-of-bounds exception
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index out-of-bounds: " + e);
}
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
}
}
}
ไม่มีบรรทัดคำสั่ง :เมื่อคุณเรียกใช้โปรแกรมโดยไม่มีอาร์กิวเมนต์บรรทัดคำสั่ง ข้อยกเว้นแบบหารด้วยศูนย์จะถูกสร้างขึ้นโดยบล็อกการลองภายนอก
อาร์กิวเมนต์บรรทัดคำสั่งหนึ่งรายการ :การดำเนินการของโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่งหนึ่งรายการจะสร้างข้อยกเว้นแบบหารด้วยศูนย์จากภายในบล็อกการลองที่ซ้อนกัน เนื่องจากบล็อกภายในไม่พบข้อยกเว้นนี้ จึงถูกส่งต่อไปยังบล็อกลองภายนอกซึ่งจะถูกจัดการ
อาร์กิวเมนต์บรรทัดคำสั่งสองรายการ : หากคุณรันโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่งสองรายการ ข้อยกเว้นขอบเขตอาร์เรย์จะถูกสร้างขึ้นจากภายในบล็อกการลองภายใน นี่คือตัวอย่างการทำงานที่แสดงแต่ละกรณี:
C:\>java NestTry
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One
a = 1
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One Two
a = 2
Array index out-of-bounds:
java.lang.ArrayIndexOutOfBoundsException:42
สิ่งนี้เป็นสิ่งที่หลีกเลี่ยงไม่ได้ในบางครั้ง โดยเฉพาะอย่างยิ่งหากรหัสกู้คืนของคุณอาจมีข้อยกเว้น ไม่สวย แต่บางครั้งก็ไม่มีทางเลือกอื่น
หมายเหตุด้านข้าง
- ถ้างบทดลองภายในไม่มีคำสั่ง catch ที่ตรงกัน สำหรับข้อยกเว้นเฉพาะ การควบคุมจะถูกถ่ายโอนไปยังตัวจัดการ catch คำสั่ง try ถัดไป ที่คาดหวังสำหรับคำสั่ง catch ที่ตรงกัน
- สิ่งนี้จะดำเนินต่อไปจนกว่าคำสั่ง catch จะสำเร็จหรือจนกว่า คำสั่ง try ที่ซ้อนกัน ทั้งหมด จะเสร็จสิ้น
- หากไม่มีคำสั่ง catch ที่ตรงกันระบบรันไทม์ของ Javaจะจัดการกับข้อยกเว้น แต่ละครั้งที่ try block ไม่มีตัวจัดการ catch สำหรับข้อยกเว้นเฉพาะ บล็อก catch ของบล็อก try หลักจะได้รับการตรวจสอบสำหรับข้อยกเว้นนั้น หากพบว่าการจับคู่นั้นตรงกัน บล็อก catch นั้นดำเนินการถ้าทั้ง catch block และ parent catch block ไม่รองรับข้อยกเว้น จากนั้นระบบจะแสดงข้อความรันไทม์สำหรับข้อยกเว้น คล้ายกับที่เราเห็นเมื่อเราไม่จัดการกับข้อยกเว้น
- เมื่อใช้บล็อกการลองที่ซ้อนกันบล็อกการลองภายในจะถูกดำเนินการก่อน ข้อยกเว้นใดๆ ที่เกิดขึ้นในบล็อกการลองภายในจะติดอยู่ในบล็อกจับ ที่สอดคล้องกัน หากไม่พบ catch block ที่ตรงกัน บล็อก catch ของบล็อก try ภายนอกจะถูกตรวจสอบจนกว่าคำสั่ง try ที่ซ้อนกันทั้งหมดจะหมดลง หากไม่พบบล็อกที่ตรงกันJava Runtime Environmentจะจัดการการดำเนินการ
// An example of nested try statements.
class NestTry {
public static void main(String args[]) {
try {
int a = args.length;
/* If no command-line args are present,
the following statement will generate
a divide-by-zero exception. */
int b = 42 / a;
System.out.println("a = " + a);
try { // nested try block
/* If one command-line arg is used,
then a divide-by-zero exception
will be generated by the following code. */
if(a==1) a = a/(a-a); // division by zero
/* If two command-line args are used,
then generate an out-of-bounds exception. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // generate an out-of-bounds exception
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index out-of-bounds: " + e);
}
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
}
}
}
C:\>java NestTry
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One
a = 1
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One Two
a = 2
Array index out-of-bounds:
java.lang.ArrayIndexOutOfBoundsException:42
/* Try statements can be implicitly nested via
calls to methods. */
class MethNestTry {
static void nesttry(int a) {
try { // nested try block
/* If one command-line arg is used,
then a divide-by-zero exception
will be generated by the following code. */
if(a==1) a = a/(a-a); // division by zero
/* If two command-line args are used,
then generate an out-of-bounds exception. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // generate an out-of-bounds exception
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index out-of-bounds: " + e);
}
}
public static void main(String args[]) {
try {
int a = args.length;
/* If no command-line args are present,
the following statement will generate
a divide-by-zero exception. */
int b = 42 / a;
System.out.println("a = " + a);
nesttry(a);
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
}
}
}
ขอบคุณที่อ่าน ขอให้มีความสุขกับการเรียนรู้
เข้าร่วมกลุ่ม Mouad Oumous Java WhatsApp เข้าร่วม
เข้าร่วม Mouad Oumous Telegram Channel เข้าร่วม
สนับสนุนสิ่งพิมพ์ของเราโดยติดตาม





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)