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

Xử Lý Ngoại Lệ Với Try Catch Trong Java

Ngay cả những lập trình viên giỏi nhất cũng mắc lỗi trong mã. Lỗi có thể xảy ra do lỗi đánh máy, đầu vào người dùng không mong đợi, hoặc nhiều lý do khác khó theo dõi.

Đó là lúc xử lý ngoại lệ (exception handling) xuất hiện. Mã tốt bao gồm trình xử lý ngoại lệ, sẽ phản hồi lỗi trong mã theo cách được xác định trước. Trình xử lý ngoại lệ hữu ích vì chỉ dẫn chương trình cách phản hồi nếu và khi lỗi xảy ra.

Trong Java, khối try...catch dùng cho xử lý ngoại lệ. Hướng dẫn này sẽ thảo luận cơ bản về xử lý ngoại lệ, cách dùng khối try...catch xử lý ngoại lệ, và cách dùng câu lệnh finally với try...catch. Chúng ta cũng sẽ đi qua vài ví dụ khối try...catch trong thực tế.

Ngoại Lệ Trong Java

Ngoại lệ là sự kiện bất ngờ xảy ra khi chương trình đang thực thi. Ngoại lệ sẽ làm gián đoạn luồng chương trình và có thể khiến chương trình dừng chạy trước khi hoàn thành.

Ngoại lệ xảy ra vì nhiều lý do, bao gồm: không thể truy cập máy chủ, lỗi mã, lỗi đánh máy, mở file không tồn tại, đầu vào người dùng sai, và hơn nữa.

Thông báo lỗi khác với ngoại lệ trong Java. Lỗi (errors) đề cập đến điều kiện mà chương trình không thể khôi phục, như hết bộ nhớ. Vì vậy, lỗi thường không được xử lý bởi lập trình viên.

Nhưng ngoại lệ là vấn đề trong chương trình có thể xử lý. Khi ngoại lệ được ném (raised), một đối tượng được tạo gọi là đối tượng ngoại lệ. Các đối tượng này chứa dữ liệu về ngoại lệ, như tên và nơi nó được ném trong chương trình.

Bây giờ bạn biết cơ bản về xử lý ngoại lệ trong Java, chúng ta có thể bắt đầu dùng câu lệnh try...catch xử lý những ngoại lệ đó.

Try Catch Trong Java

Câu lệnh try...catch dùng để xử lý ngoại lệ trong Java. Để xử lý ngoại lệ, khối mã sẽ được đặt trong khối try_catch.

Khi chương trình gặp khối try_catch, mã trong khối try sẽ được thực thi. Nếu ngoại lệ được ném, mã trong khối catch sẽ thực thi ngay lập tức. Khối catch phải đứng sau khối try trong câu lệnh try..catch.

Cú pháp câu lệnh try_catch trong Java:

try { // Code to run } catch (ExceptionType error) { // Code to run when exception is raised } finally { // Code to run even if exception is not raised }

Chúng ta sẽ nói về khối finally sau, nhưng hiện tại tập trung vào khối try_catch. Hãy đi qua ví dụ minh họa khối mã này hoạt động như thế nào.

Ví Dụ Try Catch Trong Java

Giả sử tạo chương trình dùng mảng studentNames. Chúng ta muốn in tên thứ năm trong mảng studentNames ra bảng điều khiển. Tuy nhiên, lớp chỉ có sáu học sinh.

Điều này sẽ dẫn đến lỗi trong mã vì tham chiếu giá trị không tồn tại. Ví dụ chương trình thử in tên học sinh có chỉ số 5 (học sinh thứ sáu, vì chỉ số bắt đầu từ 0):

class Main { public static void main(String[] args) { String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"}; System.out.println(studentNames[5]); }

Mã trả về:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at Main.main(Main.java:4)

Như bạn thấy, chương trình trả về lỗi dài vì thử tham chiếu giá trị không tồn tại.

Bây giờ, hãy thử dùng khối try...catch xử lý lỗi. Khi gặp lỗi, chương trình nên in There was an error, để biết có sự cố. Có thể dùng mã sau:

class Main { public static void main(String[] args) { try { String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"}; System.out.println(studentNames[5]); } catch (Exception e) { System.out.println("There was an error."); } }

Khi chạy mã, phản hồi sau được trả về:

There was an error.

Ngoài ra, có thể chỉ định nhiều khối catch. Điều này hữu ích vì cho phép xử lý từng ngoại lệ khác nhau.

Trong ví dụ trên, ArrayIndexOutOfBoundsException được ném. Nếu muốn kiểm tra lỗi cụ thể đó, có thông báo tùy chỉnh in ra bảng điều khiển, và kiểm tra ngoại lệ chung khác, có thể dùng nhiều câu lệnh catch.

Ví dụ chương trình kiểm tra cả ArrayIndexOutOfBoundsException và Exception chung, có phản hồi tùy chỉnh cho từng lỗi:

class Main { public static void main(String[] args) { try { String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"}; System.out.println(studentNames[5]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndexOutOfBoundsException was raised."); } catch (Exception e) { System.out.println("There was an error."); } } }

Bây giờ, khi chạy chương trình, thông báo sau in ra bảng điều khiển:

ArrayIndexOutOfBoundsException was raised.

Phản hồi này trả về vì ArrayIndexOutOfBoundsException được ném trong chương trình. Nhưng nếu lỗi khác xảy ra, mã trong khối catch Exception e sẽ chạy, và thông báo sau in ra bảng điều khiển:

There was an error.

Câu Lệnh Finally

Câu lệnh finally dùng để thực thi khối mã sau khi khối try...catch đã thực thi. Khối finally là tùy chọn, và luôn được thực thi nếu được định nghĩa. Nếu không có ngoại lệ ném, khối finally thực thi sau khối try; nếu ngoại lệ ném, nó thực thi sau khối catch.

Hãy dùng ví dụ trên minh họa câu lệnh finally trong thực tế. Giả sử muốn thông báo in ra bảng điều khiển This block has finished executing cho biết câu lệnh try_catch hoàn tất. Có thể thử mã sau:

class Main { public static void main(String[] args) { try { String[] studentNames = {"Linda", "Greg", "Ron", "Graham", "Alexis"}; System.out.println(studentNames[5]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndexOutOfBoundsException was raised."); } catch (Exception e) { System.out.println("There was an error."); } finally { System.out.println("This block of code has finished executing."); } } }

Khi chạy mã, phản hồi sau được trả về:

ArrayIndexOutOfBoundsException was raised.
This block of code has finished executing.

Như bạn thấy, mã ném ngoại lệ ArrayIndexOutOfBoundsException, như thấy ở trên, và thực thi mã trong khối catch liên quan.

Trong ví dụ trên, chúng ta chỉ định câu lệnh finally. Vì vậy, mã in thông báo This block of code has finished executing. sau khi khối catch thực thi.

Kết Luận

Khối try...catch trong Java dùng để xử lý ngoại lệ một cách khéo léo. Mã trong khối try được thực thi, và nếu ngoại lệ được ném, mã trong khối catch liên quan được thực thi. Ngoài ra, câu lệnh finally dùng để thực thi mã sau khi khối try...catch thực thi, ngay cả khi không có ngoại lệ ném.

Hướng dẫn này đã thảo luận cách dùng khối try...catch xử lý ngoại lệ trong Java và cách dùng khối finally của Java. Chúng ta cũng đi qua ví dụ cả khối try...catch và câu lệnh finally được dùng xử lý lỗi.

Bạn đã trang bị thông tin cần thiết để xử lý ngoại lệ trong Java với sự tự tin!