Thử-Bắt-Cuối cùng Trong Java | Xử lý ngoại lệ

Feb 21 2023
· Khối thử · Khối bắt · Khối cuối cùng · Đặt tất cả lại với nhau · Khối thử lồng nhau · Bắt nhiều ngoại lệ Thử khối Thử khối là phần đầu tiên của khối thử/bắt. Chúng chứa bất kỳ mã nào có thể gây ra ngoại lệ.

· Khối thử
· Khối
bắt · Khối cuối cùng
· Đặt tất cả lại với nhau
· Khối thử lồng nhau
· Bắt nhiều ngoại lệ

thử khối

Các khối thử là phần đầu tiên của các khối thử/bắt. Chúng chứa bất kỳ mã nào có thể gây ra ngoại lệ. Trong Java khi chúng ta không chắc chắn về kết quả của một câu lệnh, chúng ta có thể đặt những câu lệnh đó bên trong khối thử này. Một khối thử có thể được sử dụng trong một phương thức hoặc một khối thử khác.

Khối thử luôn được theo sau bởi khối bắt , khối này xử lý ngoại lệ xảy ra trong khối thử được liên kết.

Đối với IOExceptions, hãy đặt bất kỳ mã nào đang tạo, đọc từ, ghi vào hoặc đóng tệp bên trong khối thử

cú pháp

Bước đầu tiên trong việc xây dựng một trình xử lý ngoại lệ là gửi kèm mã có thể đưa ra một ngoại lệ trong một khối thử . Nói chung, một khối thử trông giống như sau:

try {
    code
}
catch and finally blocks . . .

Ví dụ

Để xây dựng một trình xử lý ngoại lệ cho phương thức writeList từ lớp ListOfNumbers, hãy đặt các câu lệnh ném ngoại lệ của phương thức writeList trong một khối thử . Có nhiều hơn một cách để làm điều này. Bạn có thể đặt từng dòng mã có thể đưa ra ngoại lệ trong khối thử riêng của nó và cung cấp các trình xử lý ngoại lệ riêng cho từng dòng. Hoặc, bạn có thể đặt tất cả mã writeList trong một khối thử và liên kết nhiều trình xử lý với nó. Danh sách sau đây sử dụng một khối thử cho toàn bộ phương pháp vì mã được đề cập rất ngắn.

private List<Integer> list;
private static final int SIZE = 10;

public void writeList() {
    PrintWriter out = null;
    try {
        System.out.println("Entered try statement");
        FileWriter f = new FileWriter("OutFile.txt");
        out = new PrintWriter(f);
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    }
    catch and finally blocks  . . .
}

Hãy thử ghi chú bên khối

  • Bên cạnh mã có thể kích hoạt ngoại lệ, các khối thử cũng có thể (nhưng không bắt buộc) chứa mã không gây ra ngoại lệ.
  • Các chương trình có thể chứa nhiều hơn một khối thử. Ngoài ra, có thể có một khối thử bên trong một khối thử khác.

bắt khối

Nửa sau của khối thử/bắt là khối bắt. Trong khi khối try chứa mã gây ra ngoại lệ, thì khối catch chứa mã xử lý ngoại lệ.

Trong Java, khối bắt được sử dụng để xử lý ngoại lệ được bắt từ khối thử. Khối catch bao gồm mã và nó được thực thi nếu xảy ra ngoại lệ bên trong khối try. Nếu hệ thống gặp phải một ngoại lệ trong khi thực hiện các câu lệnh trong khối thử, nó sẽ bỏ qua phần còn lại của các câu lệnh và chuyển quyền kiểm soát sang khối bắt tương ứng.

Khối catch bắt và xử lý các ngoại lệ của khối thử bằng cách khai báo loại ngoại lệ trong tham số. Ngoại lệ được khai báo trong khối bắt phải là ngoại lệ của lớp cha (tức là Ngoại lệ) hoặc loại ngoại lệ được tạo. Tuy nhiên, cách tiếp cận tốt nhất là khai báo loại ngoại lệ đã tạo.

Khối bắt sẽ luôn theo sau khối thử. Khi điều khiển xuất hiện từ khối thử, không có cách nào lấy lại quyền kiểm soát đó để thử khối.

cú pháp

Bạn kết hợp trình xử lý ngoại lệ với khối thử bằng cách cung cấp một hoặc nhiều khối bắt trực tiếp sau khối thử . Không có mã nào có thể nằm giữa phần cuối của khối thử và phần đầu của khối bắt đầu tiên .

try {
  
} catch (ExceptionType name) {

}

Khối catch chứa mã được thực thi nếu và khi trình xử lý ngoại lệ được gọi. Hệ thống thời gian chạy gọi trình xử lý ngoại lệ khi trình xử lý là trình xử lý đầu tiên trong ngăn xếp cuộc gọi có Loại ngoại lệ khớp với loại ngoại lệ được ném. Hệ thống coi đó là đối sánh nếu đối tượng bị ném có thể được gán một cách hợp pháp cho đối số của trình xử lý ngoại lệ.

Bắt đối số khối

Các khối bắt lấy một đối số, loại ngoại lệ mà chúng phải bắt (xử lý). Các đối số này có thể bao gồm từ một loại ngoại lệ rất cụ thể đến một loại ngoại lệ bắt tất cả rất chung chung

Ví dụ

Sau đây là hai trình xử lý ngoại lệ cho phương thức writeList :

try {

} catch (IndexOutOfBoundsException e) {
    System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

Bắt nội dung khối

Nội dung của khối catch là những gì bạn muốn xảy ra khi một ngoại lệ xảy ra (ví dụ: khi tệp đang được truy cập không tồn tại.) Bạn có thể in một thông báo hoặc có mã thực hiện điều gì đó để sửa lỗi (ví dụ: yêu cầu tên tập tin một lần nữa.

Catch Block Messages (Hiển thị Mô tả về Ngoại lệ)

Bạn có thể in bất kỳ tin nhắn nào bạn thích bên trong một khối bắt.

Sử dụng toString()

Throwable sẽ ghi đè phương thức toString() (do Object xác định) để nó trả về một chuỗi chứa mô tả về ngoại lệ. Bạn có thể hiển thị mô tả này trong câu lệnh println( ) bằng cách chuyển ngoại lệ làm đối số. Ví dụ, khối lệnh bắt trong chương trình trước có thể được viết lại như thế này

catch (ArithmeticException e) {
    System.out.println("Exception: " + e);
    a = 0; // set a to zero and continue
  }

Exception: java.lang.ArithmeticException: / by zero

  • getMessage() : trả về thông báo lỗi dành riêng cho từng loại ngoại lệ. Ghép nối điều này với một câu lệnh println.
  • printStackTrace() : in loại lỗi và nơi xảy ra lỗi trong chương trình Các phương thức này đặc biệt hữu ích để gỡ lỗi và tìm lý do cho một ngoại lệ
  • Mỗi khối thử cần ít nhất một khối bắt.
  • Các khối thử có thể có nhiều khối bắt. Xem ví dụ bên phải.
  • Các khối bắt phải xuất hiện ngay sau khối thử mà chúng được ghép nối với.

khối cuối cùng

Từ khóa cuối cùng được sử dụng để tạo một khối mã theo sau khối thử. Một khối mã cuối cùng luôn được thực thi cho dù có ngoại lệ xảy ra hay không. Sử dụng khối cuối cùng, nó cho phép bạn chạy bất kỳ câu lệnh loại dọn dẹp nào mà bạn muốn thực thi, bất kể điều gì xảy ra trong mã được bảo vệ. Một khối cuối cùng xuất hiện ở cuối khối bắt. cuối cùng các khối được sử dụng để vô hiệu hóa các tham chiếu đối tượng và đóng các luồng I/O.

Khối cuối cùng luôn thực thi khi khối thử thoát. Điều này đảm bảo rằng khối cuối cùng được thực thi ngay cả khi xảy ra ngoại lệ không mong muốn. Nhưng cuối cùng không chỉ hữu ích cho việc xử lý ngoại lệ — nó cho phép lập trình viên tránh việc mã dọn dẹp vô tình bị bỏ qua bởi return , continue hoặc break . Đưa mã dọn dẹp vào khối cuối cùng luôn là một phương pháp hay, ngay cả khi không có ngoại lệ nào được dự đoán trước.

Hệ thống thời gian chạy luôn thực thi các câu lệnh trong khối cuối cùng bất kể điều gì xảy ra trong khối thử . Vì vậy, đó là nơi hoàn hảo để thực hiện dọn dẹp.

cú pháp

finally {
  // cleanup code
  }

Khối cuối cùng sau đây dành cho phương thức writeList sẽ dọn sạch và sau đó đóng PrintWriter và FileWriter .

finally {
    if (out != null) { 
        System.out.println("Closing PrintWriter");
        out.close(); 
    } else { 
        System.out.println("PrintWriter not open");
    } 
    if (f != null) {
	    System.out.println("Closing FileWriter");
	    f.close();
	}	
}

  • Cuối cùng, các khối là một bổ sung tùy chọn cho các khối thử/bắt.
  • Cuối cùng, các khối được sử dụng cho mã mà bạn muốn chạy bất kể điều gì xảy ra ngoại lệ với mã của bạn.
  • Chúng là thứ cuối cùng thực thi và chúng sẽ thực thi mỗi khi bạn chạy chương trình của mình.
  • Một cách sử dụng khối cuối cùng là để đảm bảo tệp được đóng ở cuối chương trình.

private List<Integer> list;
private static final int SIZE = 10;

public void writeList() {
    PrintWriter out = null;
    try {
        System.out.println("Entered try statement");
        FileWriter f = new FileWriter("OutFile.txt");
        out = new PrintWriter(f);
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    } 
    // catch blocks
    catch (IndexOutOfBoundsException e) {
        System.err.println("IndexOutOfBoundsException: " + e.getMessage());
    } 
    catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    }
    // finally block
  finally {
    if (out != null) { 
        System.out.println("Closing PrintWriter");
        out.close(); 
    } else { 
        System.out.println("PrintWriter not open");
    } 
    if (f != null) {
     System.out.println("Closing FileWriter");
     f.close();
 } 
}
}

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 bắt phù hợp, thì khối bắt của khối thử bên ngoài sẽ được kiểm tra. Quá trình này tiếp tục cho đến khi hết tất cả các câu lệnh lồng nhau. Nếu không tìm thấy khối catch phù hợp, chương trình sẽ kết thúc bất thường.

truy cập vào khối try-catch lồng nhau .

Bắt nhiều ngoại lệ

Như bạn có thể biết trong java, chúng ta có thể sử dụng nhiều khối bắt để xử lý nhiều ngoại lệ

Ví dụ :

catch (IOException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
catch (SQLException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Ví dụ :

catch(IOException | SQLException ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Học 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ó

Bắt đầu với Khởi động mùa xuân: Hướng dẫn toàn diện cho người mới bắt đầu Bảo mật khởi động mùa xuân | SSO | OAuth2 với Okta Câu hỏi phỏng vấn dựa trên luồng Java8 thường gặp nhất — Phần 2 Hướng dẫn ánh xạ đối tượng với ModelMapper trong Java Mã hóa: Làm phẳng một mảng trong Javascript Câu hỏi phỏng vấn dựa trên luồng Java8 thường gặp nhất — Phần 1