Một vài những ngoại lệ xảy ra bởi lỗi của người dùng, một số khác bởi lỗi của lập trình viên và số khác nữa đến từ lỗi của nguồn dữ liệu vật lý. Để hiểu về cách xử lý ngoại lệ trong Java, bạn cần phải hiểu những loại ngoại lệ như sau: Checked Exception: Là ngoại lệ thường xảy ra do người dùng mà không thể lường trước được bởi lập trình viên. Ví dụ, một file được mở, nhưng file đó không thể tìm thấy và ngoại lệ xảy ra. Những ngoại lệ này không thể được bỏ qua trong quá trình biên dịch. Checked Exception là các lớp mà kế thừa lớp Throwable ngoại trừ RuntimeException và Error. Ví dụ như IOException, SQLException, … Checked Exception được kiểm tra tại thời gian biên dịch compiletime. Unchecked Exception: Một ngoại lệ xảy ra ở runtime là ngoại lệ có thể tránh được bởi lập trình viên. Unchecked Exception là các lớp kế thừa RuntimeException, ví dụ ArithmaticException, NullPointerException, ArrayIndexOutOfBoundsException, … Unchecked Exception không được kiểm tra tại compiletime, thay vào đó chúng được kiểm tra tại runtime. Error: Nó không giống các exception, nhưng vấn đề xảy ra vượt quá tầm kiểm soát của lập trình viên hay người dùng. Error được bỏ qua trong code của bạn vì bạn hiếm khi có thể làm gì đó khi chương trình bị error. Ví dụ như OutOfMemoryError, VirtualMachineError, AssertionError, … Nó được bỏ qua trong quá trình Java biên dịch.
Trang 1Xử lý Ngoại lệ
(Processing Exception)
Trang 2Nội dung
Ngoại lệ là gì ?
Xử lý Ngoại lệ
Trang 3Giới thiệu
Java có sẵn cơ chế cho việc kiểm soát lỗi và bẫy lỗi
Cơ chế này giải quyết những sự kiện bất
thường hay mã xử lý cản trở chương trình tiếp tục thực hiện như:
◦ Truy cập ngoài giới hạn mảng
◦ Chia cho 0
◦ Những con trỏ Null
◦ …
Các Ngoại lệ (Exception) cho phép chúng ta kiểm soát các sự kiện này tự động khi chúng xảy ra
Trang 4Ngoại lệ là gì?
Một Ngoại lệ (Exception) là một lớp Java
Có nhiều lớp dẫn xuất của lớp Exception, mỗi lớp tương ứng với một kiểu lỗi khác nhau hay
sự kiện bất thường mà chúng ta muốn kiểm soát
Cách Java phát sinh Ngoại lệ
◦ Khi có lỗi hoặc sự kiện bất thường xuất hiện trong đoạn chương trình, Java sẽ throw (ném ra) một Ngoại
lệ.
◦ Điều này có nghĩa rằng nó sẽ khởi tạo một lớp dẫn xuất của lớp Exception.
◦ Khi đó phải cần một cơ chế để catching (bắt) trong
đoạn chương trình đó.
Trang 5Ném Ngoại lệ
Thực chất, việc ném ra các Ngoại lệ trong Java
là một cách phương thức kết thúc xử lý
Ví dụ:
Trang 6Bắt Ngoại lệ (Catching Exception)
Lúc bạn gọi một phương thức đã được khai báo có khả năng ném ra một Ngoại lệ, bạn có thể bắt Ngoại lệ sử dụng một khối try/catch
Nếu Ngoại lệ được ném bên trong khối try, đối tượng Ngoại lệ được truyền như một đối
số tới khối catch ở đó Ngoại lệ có thể được kiểm soát
Trang 7Bắt Ngoại lệ (Catching Exception)
Trong hầu hết các trường hợp, nếu một
phương thức có thể ném ra một Ngoại lệ và bạn muốn gọi nó thì bạn phải xử lý Ngoại lệ của phương thức đó
Tuy nhiên, nếu Ngoại lệ mà phương thức ném
ra là một lớp dẫn xuất của lớp
RunTimeException thì không cần phải tường minh bắt Ngoại lệ (điều này bao gồm
IndexOutOfBoundsException từ ví dụ trước)
Nếu một RunTimeException được ném ra và không được bắt, Java sẽ tự động abort (bỏ dở)
chương trình và in chồng vệt tin của ngoại lệ
Trang 8 Một số lớp dẫn xuất của lớp RunTimeException
◦ ArithmeticException
◦ IndexOutOfBoundsException
◦ NegativeArraySizeException
◦ NullPointerException
◦ ArrayStoreException
◦ ClassCastException
◦ IllegalArgumentException
◦ SecurityException
◦ IllegalMonitorStateException
◦ IllegalStateException
◦ UnsupportedOperationException
Trang 9Xử lý Ngoại lệ
Xử lý Ngoại lệ có thể sử dụng khối try/catch
Ngoài ra, trong các phương thức ném ra cùng Ngoại lệ có thể chuyển việc bắt Ngoại lệ cho đoạn code gọi phương thức đó
Trang 10Nhiều khối catch
Đôi khi, một phương thức có thể ném ra nhiều hơn một Ngoại lệ, hay khối try có thể gọi hai phương thức khác nhau mà ném ra hai ngoại lệ khác nhau.
Trang 11Nhiều khối catch
Tất cả các ngoại lệ đều là các lớp dẫn xuất của lớp Exception, do đó có thể khái quát hóa các khối catch để chấp nhận nhiều kiểu Ngoại
lệ khác nhau bởi việc sử dụng lớp cơ sở
Exception
Ví dụ:
Trang 12Khối finally
Đôi khi, khi gọi khối try/catch, một Ngoại lệ có thể được ném ra trước khi một số đoạn mã quan trọng cần được chạy ở cuối của khối try
Khối finally có thể được sử dụng chạy mã này
Dù một ngoại lệ được ném ra, khối finally luôn luôn thực hiện
Trang 13Ném lại Ngoại lệ
Bạn có thể ném lại Ngoại lệ sau khi bắt và xử lý nó
Nếu bạn ném lại một Ngoại lệ, bạn phải chỉ rõ rằng phương thức gọi có khả năng ném Ngoại lệ.
Ví dụ:
Trang 14Một số Ngoại lệ
Các lớp Ngoại lệ:
◦ IOException
◦ NumberFormatedException
◦ InterruptedException
◦ FileNotFoundException
◦ …
Các thông tin từ các đối tượng Ngoại lệ
◦ getCause()
◦ getMessage()
◦ printStackTrace()
Bạn cũng có thể định nghĩa lớp Ngoại lệ của mình
nhưng phải là một lớp dẫn xuất của lớp Exception hay một trong số những lớp dẫn xuất của nó.
Trang 15Tóm lại
Khái niêm Ngoại lệ
Cách xử lý Ngoại lệ
Một số Ngoại lệ