Hướng dẫn cơ chế xử lý Exception trong Java (Phần I)

Ngày đăng: 23/01/2019   -    Cập nhật: 23/01/2019
Ngoại lệ trong Java (Exception Java): Là những tình huống bất thường xảy ra trong quá trình thực thi một chương trình Java.

Ngoại lệ xảy ra khiến cho chương trình bị dừng một cách bất thường, không theo mong muốn của người dùng.

Để tránh cho chương trình bị dừng một cách đột ngột không mong muốn, khi lập trình ta cần cài đặt cơ chế xử lý ngoại lệ.

Trong Java, mỗi khi chương trình có lỗi xảy ra, ta thường nói chương trình Java đã ném ra ngoại lệ 
(throw exception).

Trong Java, để cài đặt cơ chế xử lý ngoại lệ (Exception Handling), ta cần cài đặt 3 khối lệnh như sau:


  1. Khối try: Là khối lệnh chứa các đoạn mã nguồn mà ta cho rằng có khả năng gây ra lỗi. Khối try sẽ được chứa các câu lệnh để thử lỗi.
  2. Khối catch: Dùng để xử lý ngoại lệ. Khối catch sẽ chứa các đoạn mã dùng để xử lý mỗi khi có một ngoại lệ tương ứng xảy ra. Việc xử lý có thể bao gồm việc in thông báo, kết thúc chương trình, giải phóng bộ nhớ, gọi đến các method khác, ném ra ngoại lệ v.v…
  3. Khối finally: Dùng để dọn dẹp và giải phóng tài nguyên. Khối finally là khối lệnh mà sẽ luôn được thực hiện, cho dù chương trình có bị lỗi hay không. Khối finally thường được sử dụng để giải phóng tài nguyên khi chương trình bị lỗi, ví dụ như: đóng kết nối đến CSDL, đóng tập tin …

1. Cơ chế xử lý ngoại lệ (Exception Handling) trong Java


Mỗi khi một dòng lệnh ở khối try ném ra ngoại lệ, khối try sẽ dừng việc thực thi tại dòng đó, và điều khiển của chương trình sẽ chuyển đến các khối catch để xử lý ngoại lệ.

Chương trình sẽ tìm lần lượt từng khối catch để xem ngoại lệ được ném ra có phù hợp với khối catch đó hay không. Nếu một khối catch có thể xử lý ngoại lệ, thì chương trình sẽ thực thi khối catch đó, và bỏ qua tất cả các khối catch còn lại.

Nếu tất cả các khối catch đều không xử lý được ngoại lệ, thì chương trình sẽ dừng, và máy ảo Java sẽ xử lý ngoại lệ.

2. Một số điều chú ý khi viết mã xử lý ngoại lệ


  • Khối try không thể đứng một mình, mà phía sau khối try cần phải khai báo khối catch hoặc finally (hoặc cả hai).
  • Sau khối try có thể khai báo nhiều khối catch (như ví dụ bên dưới). Mỗi khối catch sẽ chịu trách nhiệm xử lý một loại ngoại lệ khác nhau.
  • Nên viết khối finally, để có thể giải phóng tài nguyên nếu chương trình có lỗi hoặc không.

3. Ví dụ cách xử lý ngoại lệ trong lập trình Java


Sử dụng một trình soạn thảo Java, như NetBeans hoặc Eclipse. Tạo mới một ứng dụng Java. Đặt tên và đường dẫn chứa ứng dụng.

Sau đó ta viết mã để thử lỗi. Trong khối try, ta viết một số dòng lệnh có thể sẽ gây ra ngoại lệ. Sau đó, sau khối try, ta viết một số khối catch để xử lý từng loại ngoại lệ có thể được ném ra trong khối try.


Hướng dẫn xử lý ngoại lệ (exception) trong Java 1
Hướng dẫn xử lý ngoại lệ (exception) trong Java 2
Hướng dẫn xử lý ngoại lệ (exception) trong Java 3

Ở trong chương trình này, ta cũng cài đặt khối finally để có thể minh họa về việc thực hiện của khối này.

Đầu tiên, ta thực thi chương trình, ta có thể thấy chương trình hoạt động tốt, không ném ra ngoại lệ.


Chương trình hoạt động tốt, không ném ra ngoại lệ

Chương trình hoạt động tốt, không ném ra ngoại lệ


Sau đó, ta sẽ thử từng loại ngoại lệ. Đầu tiên ta gán chuỗi s bằng null, như vậy câu lệnh tiếp theo sẽ ném ra ngoại lệ NullPointerException.


Ngoại lệ NullPointerException.

Khai báo s null để tạo ra ngoại lệ NullPointerException.

Sau đó khi chạy chương trình, ta sẽ thấy chương trình ném ra ngoại lệ NullPointerException, chương trình sẽ thực thi khối catch tương ứng với ngoại lệ này.

Ta có thể thấy khối finally vẫn thực thi sau khi ngoại lệ được ném ra.




Ngoại lệ NullPointerException.

Sau đó, ta thử một ngoại lệ khác, ta thử truy cập đến một phần tử vượt quá chiều dài mảng như hình bên dưới. Đoạn mã bên dưới sẽ có lỗi, vì mảng chỉ có kích thước là 3, nhưng ta đã truy cập đến phần tử ở vị trí thứ 6 (chỉ số là 5).



Chương trình truy cập phần tử vượt quá chiều dài của mảng
 
Sau khi thực thi, ta có thể thấy chương trình đã ném ra một ngoại lệ khác thuộc kiểu ArrayIndexOutOfBoundsException, ngoại lệ này được ném ra khi chương trình đã truy cập vượt quá chiều dài mảng (hay còn gọi là lỗi tràn mảng).Lỗi tràn mảng

Lỗi tràn mảng
 
Tiếp theo, ta sửa lại lỗi này, và ta sửa lại mã nguồn, để thực hiện xử lý một lỗi khác. Ta sửa lại chuỗi ở trên thành “abc”, rồi chuyển đổi chuỗi này thành số nguyên (chắc chắn sẽ ném ra ngoại lệ, vì chuỗi “abc” không thể chuyển được thành số).
Lỗi chuỗi không thể chuyển được thành số

Lỗi chuỗi không thể chuyển được thành số


Khi thực thi chương trình, ta có thể thấy một ngoại lệ thuộc kiểu NumberFormatException đã được ném ra. Đây là ngoại lệ được ném ra khi ta định dạng dữ liệu sai.

Ngoại lệ thuộc kiểu NumberFormatException

Ngoại lệ thuộc kiểu NumberFormatException - Định dạng dữ liệu sai


Tiếp theo, ta thử một ngoại lệ khác, ta khai báo hai biến x, y, rồi tiến hành chia 2 biến này, trong đó y = 0. Ở đây ta đã thực hiện phép chia cho 0, dòng lệnh này sẽ phát sinh ngoại lệ.

Thực hiện phép chia cho số 0

Thực hiện phép chia cho số 0


Sau khi thực thi chương trình, ta thấy ngay: Dòng lệnh trên đã hiển thị thông báo lỗi như hình bên dưới.
Lỗi khi thực hiện phép chia cho số 0

Lỗi khi thực hiện phép chia cho số 0


4. Tổng kết


Mỗi khi chương trình ném cho chúng ta điều gì đó ngoài ý muốn, bạn chắc không muốn người dùng bắt gặp nó đâu đúng không?

Hãy xử lý ngoại lệ (Exception) trong Java thật tốt để giữ chân người dùng bạn nhé.

Còn nếu bạn vẫn còn khó hiểu về Exception..

>>> Hãy tham dự ngay khóa học Lập trình Java Web. Chúng tôi sẽ giúp bạn giải quyết mọi vấn đề về ngoại lệ một cách đơn giản nhất.



Nguyễn Hùng Cường | NIIT - ICT Hà Nội
Bình luận Facebook
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!