Các khối thử lồng nhau trong Java

Mar 04 2023
Trong Java, một câu lệnh try có thể nằm trong khối lệnh try khác. Nó được gọi là khối thử lồng nhau.

Trong Java, một câu lệnh try có thể nằm trong khối lệnh try khác. Nó được gọi là khối thử lồng nhau. Mỗi khi một câu lệnh try được nhập vào, ngữ cảnh của ngoại lệ đó sẽ được đẩy vào ngăn xếp.

Tại sao nên sử dụng khối thử lồng nhau

Đôi khi có thể phát sinh tình huống trong đó một phần của khối có thể gây ra một lỗi và toàn bộ khối có thể gây ra lỗi khác. Trong những trường hợp như vậy, các trình xử lý ngoại lệ phải được lồng vào nhau.

cú pháp

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);
    }
  }
}

Không có dòng lệnh : Khi bạn thực thi chương trình mà không có đối số dòng lệnh, một ngoại lệ chia cho 0 được tạo bởi khối thử bên ngoài.

Một đối số dòng lệnh : Việc thực thi chương trình với một đối số dòng lệnh sẽ tạo ra một ngoại lệ chia cho 0 từ bên trong khối thử lồng nhau. Vì khối bên trong không bắt được ngoại lệ này nên nó được chuyển sang khối thử bên ngoài, nơi nó được xử lý.

Hai đối số dòng lệnh : Nếu bạn thực thi chương trình với hai đối số dòng lệnh, một ngoại lệ ranh giới mảng được tạo từ bên trong khối thử bên trong. Dưới đây là các lần chạy mẫu minh họa cho từng trường hợp:

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

Điều này đôi khi không thể tránh khỏi, đặc biệt nếu mã khôi phục của bạn có thể đưa ra một ngoại lệ. Không đẹp, nhưng đôi khi không có lựa chọn thay thế.

ghi chú bên lề

  • Nếu một câu lệnh try bên trong không có câu lệnh catch phù hợp cho một ngoại lệ cụ thể, quyền kiểm soát sẽ được chuyển sang trình xử lý bắt câu lệnh try tiếp theo được mong đợi cho một câu lệnh catch phù hợp.
  • Điều này tiếp tục cho đến khi một trong các câu lệnh bắt thành công hoặc cho đến khi tất cả các câu lệnh thử lồng nhau được thực hiện.
  • Nếu không có câu lệnh bắt nào khớp, thì hệ thống thời gian chạy Java sẽ xử lý ngoại lệ. Mỗi khi một khối try không có trình xử lý bắt cho một ngoại lệ cụ thể, thì các khối bắt của khối thử cha sẽ được kiểm tra ngoại lệ đó, nếu tìm thấy khớp thì khối bắt đó sẽ thực thi. Nếu cả khối bắt và khối bắt chính đều không xử lý ngoại lệ thì thông báo do hệ thống tạo trong thời gian chạy sẽ được hiển thị cho ngoại lệ, tương tự như những gì chúng ta thấy khi không xử lý ngoại lệ.
  • Khi các khối thử lồng nhau được sử dụng, khối thử bên trong sẽ được thực hiện trước. Bất kỳ ngoại lệ nào được ném vào khối thử bên trong đều bị bắt trong khối bắt tương ứng. Nếu không tìm thấy khối catch phù hợp, thì khối catch của khối try bên ngoài sẽ được kiểm tra cho đến khi hết tất cả các câu lệnh try lồng nhau. Nếu không tìm thấy khối phù hợp nào, Môi trường thời gian chạy Java sẽ xử lý việc thực thi.

// 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);
  }
}
}

Cảm ơn đã đọc. Chúc bạn học tập vui vẻ

Tham gia nhóm Mouad Oumous Java WhatsApp THAM GIA

Tham gia kênh Telegram Mouad Oumous THAM GIA

Hãy ủng hộ ấn phẩm của chúng tôi bằng cách theo dõi nó