Xử lý ngoại lệ● Ngoại lệ unchecked không cần kiểm tra■ Là các ngoại lệ không bắt buộc phải được kiểm tra.■ Gồm RuntimeException, Error và các lớp con của chúng.● Ngoại lệ checked phải ki
Trang 1Chương 3
NGOẠI LỆ
IS216 - LẬP TRÌNH JAVA
Trang 3LAMBDA EXPRESSIONS VÀ INNERCLASS
Trang 5Lambda Expressions
● Ứng dụng:
● Sử dụng với các API Stream:
● filter(), map(), forEach()
● Viết code ngắn gọn hơn:
● Thay thế cho các anonymous inner class
● Tăng khả năng đọc code:
● Code dễ hiểu và dễ bảo trì hơn
Trang 6List<String> languages = Arrays.asList("Java", "C#", "C++", "PHP", "Javascript");Collections.sort(languages, (String o1, String o2) -> {
Trang 7Lambda Expressions
● Một biểu thức Lambda (Lambda expression) trong Java gồm các phần chính sau:
● No name: không có tên phương thức, nó là một phương thức ẩn danh (anonymous method).
● Parameter list: danh sách các tham số.
● Body: biểu thức, câu lệnh xử lý.
● No return type: không có kiểu trả về tường minh, trình biên dịch có thể tự suy luận ra kiểu dữ liệu trả về dựa vào code thực thi.
Trang 8● Là class được định nghĩa bên trong một class khác (hoặc 1 interface khác).
● Có hai loại:
● Static inner class:
○ Được định nghĩa bằng static keyword
○ Có thể truy cập các biến static của outer class
● Non-static inner class:
○ Không được định nghĩa bằng static keyword
○ Có thể truy cập tất cả các biến của outer class
Trang 9● Ứng dụng:
● Tạo các class nhỏ gọn để sử dụng trong một class khác
● Tạo các class ẩn danh để sử dụng với các API như
Trang 10public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();innerClass.print();
}}
Trang 11NGOẠI LỆ
Trang 12Ngoại lệ
● Ngoại lệ (Exception): là một sự kiện xảy ra trong tiến trình thực thi của một chương trình, nó làm ngưng tiến trình bình thường của chương trình.
Trang 13Ngoại lệ
● Khi xảy ngoại lệ, nếu không xử lý chương trình sẽ kết thúc ngay.
mạng bị ngắt trong quá trình thực hiện giao tác, JVM hết bộ nhớ, Truy cập vượt ngoài chỉ số của mảng …
Trang 14Ngoại lệ
● Dựa vào tính chất các vấn đề, người ta chia ngoại lệ thành ba loại:
○ Ngoại lệ được kiểm tra (Checked Exceptions).
○ Ngoại lệ không được kiểm tra (Unchecked Exceptions).
○ Lỗi (Error).
Trang 15Ngoại lệ
Trang 16Ngoại lệ
● Error: là những lỗi nghiêm trọng xảy ra đối khi chương trình hoạt
động mà lập trình viên không thể kiểm soát Ví dụ như lỗi phần cứng, tràn bộ nhớ, hay lỗi của JVM.
viết code, vì nó được kiểm tra bởi trình biên dịch Javac Ví dụ: ClassNotFoundException, NoSuchFieldException
trình chạy, nghĩa là trình biên dịch Javac không "phát hiện" ra khi biên dịch, do vậy programmer không thể xử lý khi viết code Ví dụ: NullPointerException, ArrayIndexOutOfBoundsException,
DivideByZeroException
Trang 17XỬ LÝ NGOẠI LỆ
Trang 19Xử lý ngoại lệ
● Sử dụng các mệnh đề điều kiện kết hợp với các giá trị cờ.
○ Mục đích: thông qua tham số, giá trị trả lại hoặc giá trị cờ để
viết mã xử lý tại nơi phát sinh lỗi.
■ Làm chương trình thêm rối, gây khó hiểu.
■ Dễ nhầm lẫn
Trang 20Xử lý ngoại lệ
public class Inventory{
public final int MIN = 0; publicfinal int MAX = 100;publicfinal int CRITICAL = 10;
publicboolean addToInventory (int amount)
int temp;
temp = stockLevel + amount; if (temp > MAX){
System.out.print("Adding " + amount + " item will cause stock ");
System.out.println("to become greater than " + MAX + " units (overstock)");
Trang 22store.addToInventory (int amt){if (temp > MAX) return
false;}
Trang 24chủ có thể không biết cách xử lý khi lỗi xảy ra
Trang 26■ Ngoại lệ không cần kiểm tra (unchecked)
■ Ngoại lệ phải kiểm tra (checked)
Trang 27Xử lý ngoại lệ
● Checked vs Unchecked
Trang 28Xử lý ngoại lệ
● Ngoại lệ unchecked (không cần kiểm tra)
■ Là các ngoại lệ không bắt buộc phải được kiểm tra.
■ Gồm RuntimeException, Error và các lớp con của chúng.
● Ngoại lệ checked (phải kiểm tra)
■ Là các ngoại lệ bắt buộc phải được kiểm tra.
■ Gồm các ngoại lệ còn lại.
Trang 29Xử lý ngoại lệ
● Trình biên dịch không yêu cầu phải bắt các ngoại lệ khi nó xảy ra.
● Các ngoại lệ này có thể xảy ra bất cứ thời điểm nào khi thi hành chương trình.
● Thông thường là những lỗi nghiêm trọng mà chương trình không thể kiểm soát
● Sử dụng các mệnh đề điều kiện để xử lý sẽ tốt hơn.
● Gồm các lớp RuntimeException, Error và các lớp con của
chúng
Trang 30Xử lý ngoại lệ
● RuntimeException: chỉ các ngoại lệ xảy ra khi JVM thực thi
chương trình
oNullPointerException: con trỏ null
oOutOfMemoryException: hết bộ nhớ
oArrayIndexOutOfBoundsException: vượt quá chỉ số mảng
oArithmeticException: lỗi toán học
oClassCastException: lỗi ép kiểu
oChỉ những lỗi nghiêm trọng và không dự đoán trước được: ThreadDead, LinkageError, VirtualMachineError…
Trang 31Xử lý ngoại lệ
int [] arr = null;
Trang 32Xử lý ngoại lệ
int [] arr = null;
Trang 33Xử lý ngoại lệ
int [] arr = null;
Trang 34Xử lý ngoại lệ
● Là ngoại lệ bắt buộc kiểm tra.
● Phải xử lý khi ngoại lệ có khả năng xảy ra:
● Ví dụ: IOException, NumberFormatException
Trang 35Xử lý ngoại lệ
● try{…}: khối lệnh có khả năng gây ra ngoại lệ.
● catch{…}: nơi bắt và xử lý ngoại lệ.
Trang 37typed in " + s); num = Integer.parseInt (s);
System.out.println("Converted to an integer " + num);
Trang 38Xử lý ngoại lệ
System.out.print("Type an integer: "); s = stringInput.readLine();
System.out.println("You typed in " + s); num = Integer.parseInt (s);System.out.println("Converted to an integer " + num);
}
Trang 39Xử lý ngoại lệ
● Kết quả của phương thức readLine()try
Trang 40public BufferedReader (Reader in);
public BufferedReader (Reader in, int sz);
public String readLine () throws IOException;
}
Trang 41Xử lý ngoại lệ
● Kết quả của phương thức parseInt ()
Trang 42public Integer (int value);
public Integer (String s) throws NumberFormatException;
public static int parseInt (String s) throws NumberFormatException;
}
Trang 53// Do nothing here but set up the try-catch block to bypass the// annoying compiler error
NO!
Trang 54Xử lý ngoại lệ
● Khối finally: Là 1 khối không bắt buộc trong khối try-catch-finally.
hay không VD:
oĐóng file, đóng socket, connection
oGiải phóng tài nguyên (nếu cần)
catch block
No exception
exception
Trang 61Xử lý ngoại lệ
● Từ khóa throws được sử dụng để khai báo một ngoại lệ Nó thể hiện thông tin cho lập trình viên rằng có thể xảy ra một ngoại lệ
● Giả sử có method1 và method2 Method1 gọi method2 và method2 làphương thức có khả năng xảy ra ngoại lệ:
Trang 62● Cách 2: Khai báo throws
public static voidmain(String[ ] args) throws IOException
Strings = buff.readLine();
62
Trang 65Xử lý ngoại lệ
class Driver{
public static void main (String [] args) { TCExample eg = new TCExample (); boolean inputOkay = true;
Trang 67Xử lý ngoại lệ
● Từ khoá throw được sử dụng để ném ra một ngoại lệ cụ thể, chủ yếu được sử dụng để ném ngoại lệ tùy chỉnh (ngoại lệ do người dùng tự định nghĩa).
Trang 68Xử lý ngoại lệ
➢Sử dụng throw anExceptionObject trong thân
phương thức để tung ra ngoại lệ khi cần
➢Nếu phương thức có chứa câu lệnh throw ngoại lệ thì phần khai báo phương thức phải khai báo throws
ngoại lệ đó hoặc lớp cha của ngoại lệ đó.
Trang 69Xử lý ngoại lệ
➢Đối với RuntimeException phương thức không cần
phải khai báo throws RuntimeException vì ngoại lệ này mặc định được ủy nhiệm cho JVM
Trang 70public static void main(String[] args) {int num = cal(6,0);
} Lỗi ngoại lệ:
Exception in thread "main" java.lang.ArithmeticException: Khong the chia cho 0
Trang 71Exception in thread "main" java.lang.RuntimeException:
Uncompilable source code - unreported exception java.lang.Exception; must be caught or declared to be thrown
at exceptionex.ExceptionEx.main(ExceptionEx.java:58)
Trang 72public static void main(String[] args) throws Exception{ int num = cal(6,0);
Thêm: throws Exception
Trang 73Sau throw là một instance.Sau throws là một hoặc nhiều class.
Throwđược sử dụng trong phương thức có thể quăng ra Exception ở bất kỳ dòng nào trong phương thức (sau đó dùng try-catch để bắt hoặc throws cho phương thức khác xử lý)
Throwsđược khai báo ngay sau dấu đóng ngoặc đơn của phương thức Khi một phương thức có throwbên trong mà không bắt lại (try – catch) thì phải ném đi (throws) cho phương thức khác xử lý.Không thể throw nhiều exceptions.
Cóthể khai báo nhiều exceptions, Ví dụ:public void method() throws IOException, SQLException { }
Trang 74Xử lý ngoại lệ
➢Một phương thức có thể throw nhiều hơn 1 ngoại lệ:
public voidmethod(int tuoi, String ten)throwsArithmeticException,
➢Lan truyền ngoại lệ:
Trang 75Xử lý ngoại lệ
oNếu C() gặp lỗi và throw ra ngoại lệ nhưng trong C() lại không xử lý ngoạilệ này, thì nơi gọi C() là phương thức B() là nơi có thể xử lý ngoại lệ.
oNếu trong B() cũng không xử lý thì phải xử lý ngoại lệ này trong A()… Quátrình này gọi là lan truyền ngoại lệ.
oNếu đến main() cũng không xử lý ngoại lệ được throw từ C() thì chương
Trang 76Xử lý ngoại lệ
● Trong khối catch, ta có thể không xử lý trực tiếp ngoại lệ mà lại ném lạingoại lệ đó cho nơi khác xử lý.
● Chú ý: Trong trường hợp trên, phương thức chứa catch phải bắt ngoại lệhoặc khai báo throws cho ngoại lệ
catch (IOExceptione) {
throwe;}
Trang 77Xử lý ngoại lệ
➢Kế thừa ngoại lệ:
oKhi override một phương thức của lớp cha, phương thức ở lớp con khôngđược phép tung ra các ngoại lệ mới.
oPhương thức ghi đè trong lớp con chỉ được phép tung ra các ngoại lệ giốnghoặc là lớp con hoặc là tập con của các ngoại lệ được tung ra ở lớp cha.
Trang 78Xử lý ngoại lệ
classDisk {
public voidreadFile()throwsEOFException {}}
classFloppyDiskextendsDisk {
public voidreadFile()throwsIOException {}// ERROR!
class FloppyDisk extends Disk {
public void readFile() throws EOFException {}}
Trang 79Xử lý ngoại lệ
➢ Ưu điểm của throws/throw ➢ Dễ sử dụng
oDễ dàng chuyển điều khiển đến nơi có khả năng xử lý ngoại lệ
oCó thể throw nhiều loại ngoại lệ
➢ Tách xử lý ngoại lệ khỏi đoạn mã thông thường
➢ Không bỏ sót ngoại lệ (throws)
➢ Gom nhóm và phân loại các ngoại lệ
Trang 80Tạo ra kiểu ngoại lệ mới
Trang 82Tạo ngoại lệ mới
➢Mục đích: tạo ra ngoại lệ do người dùng định nghĩa để kiểm soát các lỗi
oKế thừa lớp Exception hoặc lớp con của nó
oCó tất cả phương thức của lớp Throwable
Trang 83Tạo ngoại lệ tự định nghĩa
Trang 84Sử dụng ngoại lệ tự định nghĩa
● Sử dụng ngoại lệ
public class Example {
public void kiemTra(String fName1,String fName2) throws
Trang 85Sử dụng ngoại lệ tự định nghĩa
public class Test {
public static void main(String[] args) {Example ex= new Example();
Trang 86Cây thừa kế của lớp IOExceptions
Trang 87Vấn đề bắt ngoại lệ
➢Khi xử lý một chuỗi các ngoại lệ cần phải đảm bảo rằng các ngoại lệ lớp conđược xử lý trước các ngoại lệ của lớp cha.
➢Xử lý các trường hợp cụ thể trước khi xử lý các trường hợp tổng quát
Trang 89Q & A
Giảng viên: Tạ Việt PhươngE-mail: phuongtv@uit.edu.vn