Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Có thể khai báo try-catch lồng nhau trong Java không?

Có, chúng ta có thể khai báo try-catch block bên trong try-catch block khác, gọi là nested try-catch block (khối try-catch lồng nhau).

Đặc điểm Nested Try-Catch Block

  • Nếu inner try statement không có catch statement phù hợp cho một exception, control chuyển sang catch handlers của try statement tiếp theo (outer) để tìm catch phù hợp.
  • Quá trình tiếp tục cho đến khi một catch statement khớp, hoặc tất cả nested try statements hết.
  • Nếu không catch nào khớp, Java runtime system xử lý exception.
  • Khi dùng nested try blocks, inner try block thực thi trước. Exception ném trong inner try bị bắt trong catch tương ứng. Nếu không tìm thấy catch khớp, catch của outer try block được kiểm tra cho đến khi hết nested try. Nếu vẫn không khớp, Java Runtime Environment xử lý.

Cú pháp

try { 
    statement 1; 
    statement 2; 
    try { 
        statement 1; 
        statement 2; 
    } 
    catch(Exception e) { 
        // catch exception tương ứng 
    } 
} catch(Exception e) { 
    // catch exception tương ứng 
} 
.............

Ví dụ minh họa

import java.io.*; 

public class NestedTryCatchTest { 
    public static void main (String args[]) throws IOException { 
        int n = 10, result = 0; 
        try { // outer try block 
            FileInputStream fis = null; 
            fis = new FileInputStream(new File(args[0])); 
            try { // inner try block 
                result = n / 0; 
                System.out.println("The result is " + result); 
            } 
            catch(ArithmeticException e) { // inner catch block 
                System.out.println("Division by Zero"); 
            } 
        } 
        catch (FileNotFoundException e) { // outer catch block 
            System.out.println("File was not found"); 
        } 
        catch(ArrayIndexOutOfBoundsException e) { // outer catch block 
            System.out.println("Array Index Out Of Bounds Exception occured"); 
        } 
        catch(Exception e) { // outer catch block 
            System.out.println("Exception occured " + e); 
        } 
    } 
}

Kết quả đầu ra

Array Index Out Of Bounds Exception occured

Giải thích

Chạy không truyền args[0] → ArrayIndexOutOfBoundsException tại args[0] (trong outer try). Inner try không chạy đến. Outer catch ArrayIndexOutOfBoundsException bắt được.

Best Practices

  • Hạn chế nested try-catch quá sâu (khó đọc, khó maintain).
  • Dùng try-with-resources (Java 7+) cho resource management thay vì nested finally.
  • Tách thành phương thức riêng cho từng logic try-catch.
  • Catch exception cụ thể trước, exception chung sau (subclass trước superclass).
  • Multi-catch (Java 7+): catch (IOException | SQLException e).