Core Java - Chương 7: Xử lý ngoại lệ

Sau khi kết thúc chương này, bạn có thể nắm được các nội dung sau:

¾ Định nghĩa một ngoại lệ (exception)

¾ Hiểu được mục đích của việc xử lý ngoại lệ

¾ Hiểu được các kiểu ngoại lệ khác nhau trong Java

¾ Mô tả mô hình xử lý ngoại lệ

¾ Hiểu được các khối lệnh chứa nhiều catch

¾ Mô tả cách sử dụng các khối ‘try’, ‘catch’ và ‘finally’

¾ Giải thích cách sử dụng các từ khoá ‘throw’ và ‘throws’

¾ Tự tạo ra các ngoại le

pdf13 trang | Chuyên mục: Java | Chia sẻ: dkS00TYs | Lượt xem: 2396 | Lượt tải: 1download
Tóm tắt nội dung Core Java - Chương 7: Xử lý ngoại lệ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
on a) 
 { 
 System.out.println(“Cannot Divide by zero”); 
 } 
 } 
} 
Kết xuất của chương trình: 
Hình 7.2 ArithmeticException 
Trong chương trình này, một số được chia cho 0. Đây không là toán tử số học hợp lệ. 
Do đó một ngoại lệ bị chặn và được bắt giữ trong khối catch. Khi người lập trình viên 
nhận biết được loại ngoại lệ nào có thể xảy ra, anh ta hay cô ta viết một câu lệnh trong 
khối ‘catch’. Ở đây, ‘a’ được sử dụng như một đối tượng của Arithmaticexception để in 
các chi tiết về các toán tử ngoại lệ mà hệ thống cung cấp. Nếu bạn thay thế lệnh 
‘System.out.println’ của khối ‘catch’ bằng lệnh ‘System.out.println(a.getMessage())’ 
thì kết xuất của chương trình như sau: 
33 
Hình 7.3 Câu thông báo lỗi 
Khi các khối ‘try’ được sử dụng mà không có các khối ‘catch’ nào, chương trình sẽ 
biên dịch mà không gặp sự cố nào nhưng sẽ bị ngắt khi thực thi. Bởi vì ngoại lệ đã xảy 
ra khi thực thi chương trình. 
7.6 Khối ‘finally’ 
Khi một ngoại lệ xuất hiện, phương thức đang được thực thi có thể bị dừng mà không 
được thi hành toàn vẹn. Nếu điều này xảy ra, thì các đoạn mã (ví dụ như đoạn mã với 
chức năng thu hồi tài nguyên có các lệnh đóng lại tập tin khai báo cuối phương thức) 
sẽ không bao giờ được gọi. Java cung cấp khối ‘finally’ để giải quyết việc này. Khối 
‘finally’ thực hiện tất cả các việc thu dọn khi một ngoại lệ xảy ra. Khối này có thể 
được sử dụng kết hợp với khối ‘try’. Khối ‘finally’ chứa các câu lệnh thu hồi tài 
nguyên về cho hệ thống hay lệnh in ra các câu thông báo. Các lệnh này bao gồm: 
¾ Đóng tập tin. 
¾ Đóng lại bộ kết quả (được sử dụng trong chương trình cơ sở dữ liệu). 
¾ Đóng lại các kết nối được tạo trong cơ sở dữ liệu. 
try 
{ 
 doSomethingThatMightThrowAnException(); 
} 
finally 
{ 
 cleanup(); 
} 
Phương thức ‘cleanup()’ được gọi nếu phương thức 
‘doSomethingThatMightThrowAnException()’ chặn một ngoại lệ. Mặt khác 
‘cleanup()’ cũng được gọi ngay khi không có ngoại lệ nào bị chặn và thi hành tiếp tục 
sau khối lệnh ‘finally’. 
34 
Khối ‘finally’ là tuỳ ý, không bắt buộc. Khối này được đặt sau khối ‘catch’. Hệ thống 
sẽ duyệt từ câu lệnh đầu tiên của khối ‘finally’ sau khi gặp câu lệnh ‘return’ hay lệnh 
‘break’ được dùng trong khối ‘try’. 
Khối ‘finally’ bảo đảm lúc nào cũng được thực thi, bất chấp có ngoại lệ xảy ra hay 
không. 
Hình 7.4 minh họa sự thi hành của các khối ‘try’, ‘catch’ và ‘finally’. 
try block
catch blockfinally block
finally block
No Exception Exception occurs
Hình 7.4 Khối lệnh ‘try’, ‘catch’ và ‘finally’ 
Hình 7.2 sử dụng khối ‘finally’. Ở đây, khối ‘finally’ được thi hành bất chấp 
‘ArithmeticException’ có xảy ra hay không. Khối này khai báo các hoạt động thu dọn. 
Chương trình 7.2 
class FinallyDemo 
{ 
 String name; 
 int no1,no2; 
 FinallyDemo(String args[]) 
 { 
 try 
 { 
 name=new String(“Aptech Limited”); 
 no1=Integer.parseInt(args[0]); 
 no2=Integer.parseInt(args[1]); 
 System.out.println(name); 
 System.out.println(“Division Result is” + no1/no2); 
 } 
 catch(ArithmeticException i) 
35 
 { 
 System.out.println(“Cannot Divide by zero”); 
 } 
 finally 
 { 
 name=null; // clean up code 
 System.out.println(“Finally executed”); 
 } 
 } 
 public static void main(String args[]) 
 { 
 new FinallyDemo(args); 
 } 
} 
Kết xuất của chương trình: 
Hình 7.5 Khối Finally 
Trong ví dụ này, các câu lệnh trong khối ‘Finally’ luôn luôn thi hành, bất chấp ngoại 
lệ có xảy ra hay không. Trong kết xuất bên trên, khối ‘finally’ được thi hành mặc dù 
không có ngoại lệ xảy ra. 
7.7 Các ngoại lệ được định nghĩa với lệnh ‘throw’ và ‘throws’ 
Các ngoại lệ bị chặn với sự trợ giúp của từ khoá ‘throw’. Từ khóa ‘throw’ chỉ ra một 
ngoại lệ vừa xảy ra. Toán tử của throw là một đối tượng của lớp, lớp này được dẫn xuất 
từ ‘Throwable’. 
Đoạn lệnh sau chỉ ra cách sử dụng của lệnh ‘throw’: 
try 
36 
{ 
 if (flag<0) 
 { 
 throw new MyException(); // user-defined 
 } 
} 
Một phương thức đơn có thể chặn nhiều ngoại lệ. Để xử lý những ngoại lệ này, ta cần 
cung cấp một danh sách các ngoại lệ mà phương thức chặn trong phần định nghĩa của 
phương thức. Giả sử rằng phương thức ‘x()’ gọi phương thức ‘y()’. Phương thức ‘y()’ 
chặn một ngoại lệ không được xử lý. Trong trường hợp này, phương thức gọi ‘x()’ nên 
khai báo việc chặn cùng một ngoại lệ với phương thức được gọi ‘y()’. Ta nên khai báo 
khối ‘try catch’ trong phương thức x() để đảm bảo rằng ngoại lệ không được truyền 
cho các phương thức mà gọi phương thức này. 
Đoạn mã sau minh họa cách sử dụng của từ khoá ‘throws’ để xử lý nhiều ngoại lệ: 
public class Example 
{ 
 // multiple exceptions separated by a comma 
 public void exceptionExample() throws ExException, LookupException 
 { 
 try 
 { 
 // statements 
 } 
 catch(ExException exmp) 
 { 
 } 
 catch(LookupException lkpex) 
 { 
 } 
 } 
} 
Trong ví dụ trên, phương thức ‘exceptionExample’ khai báo từ khoá ‘throws’. Từ khoá 
này được theo sau bởi danh sách các ngoại lệ mà phương thức này có thể chặn – Trong 
trường hợp này là ‘ExException’ và ‘LookupException’. Hàm xử lý ngoại lệ cho các 
phương thức này nên khai báo các khối ‘catch’ để có thể xử lý tất cả các ngoại lệ mà 
các phương thức chặn. 
37 
Lớp ‘Exception’ thực thi giao diện ‘Throwable’ và cung cấp các tính năng hữu dụng 
để phân phối các ngoại lệ. Ưu điểm của nó là tạo các lớp ngoại lệ được định nghĩa bởi 
người dùng. Để làm điều này, một lớp con của lớp Exception được tạo ra. Ưu điểm của 
lớp con là một kiểu ngoại lệ mới có thể bị bắt giữ độc lập từ các loại Throwable khác. 
Chương trình 7.3 minh họa ngoại lệ được định nghĩa bởi người dùng 
‘ArraySizeException’: 
Chương trình 7.3 
class ArraySizeException extends NegativeArraySizeException 
{ 
 ArraySizeException() // constructor 
 { 
 super(“You have passed an illegal array size”); 
 } 
} 
class ThrowDemo 
{ 
 int size, array[]; 
 ThrowDemo(int s) 
 { 
 size=s; 
 try 
 { 
 checkSize(); 
 } 
 catch(ArraySizeException e) 
 { 
 System.out.println(e); 
 } 
 } 
 void checkSize() throws ArraySizeException 
 { 
 if (size < 0) 
 throw new ArraySizeException(); 
 else 
 System.out.println(“The array size is ok.”); 
 array = new int[3]; 
 for (int i=0; i<3; i++) 
 array[i] = i+1; 
38 
 } 
 public static void main(String arg[]) 
 { 
 new ThrowDemo(Integer.parseInt(arg[0])); 
 } 
} 
Lớp được định nghĩa bởi người dùng ‘ArraySizeException’ là lớp con của lớp 
‘NegativeArraySizeException’. Khi một đối tượng được tạo từ lớp này, thông báo về 
ngoại lệ được in ra. Phương thức ‘checkSize()’ được gọi để chặn ngoại lệ 
‘ArraySizeException’ mà được chỉ ra bởi mệnh đề ‘throws’. Kích thước của mảng 
được kiểm tra trong cấu trúc ‘if’. Nếu kích thước là số âm thì đối tượng của lớp 
‘ArraySizeException’ được tạo. Phương thức ‘call()’ được bao quanh trong khối ‘try-
catch’, là nơi mà giá trị của đối tượng được in ra. Phương thức ‘call()’ cần được bao 
trong khối ‘try’, để cho khối ‘catch’ tương ứng có thể in ra giá trị. 
Kết xuất của chương trình được chỉ ra ở hình 7.6. 
Hình 7.6 Ngoại lệ tự định nghĩa 
7.8 Danh sách các ngoại lệ 
Bảng sau đây liệt kê một số ngoại lệ: 
Ngoại lệ Lớp cha của thứ tự phân cấp ngoại lệ 
RuntimeException Lớp cơ sở cho nhiều ngoại lệ java.lang 
ArthmeticException Trạng thái lỗi về số, ví dụ như ‘chia cho 0’ 
IllegalAccessException Lớp không thể truy cập 
IllegalArgumentException Phương thức nhận một đối số không hợp lệ 
ArrayIndexOutOfBoundsExeption Kích thước của mảng lớn hơn 0 hay lớn hơn 
kích thước thật sự của mảng 
39 
NullPointerException Khi muốn truy cập đối tượng null 
SecurityException Việc thiết lập cơ chế bảo mật không được hoạt 
động 
ClassNotFoundException Không thể nạp lớp yêu cầu 
NumberFormatException Việc chuyển đối không thành công từ chuỗi 
sang số thực 
AWTException Ngoại lệ về AWT 
IOException Lớp cha của các ngoại lệ I/O 
FileNotFoundException Không thể định vị tập tin 
EOFException Kết thúc một tập tin 
NoSuchMethodException Phương thức yêu cầu không tồn tại 
InterruptedException Khi một luồng bị ngắt 
Bảng 7.1 Danh sách một số ngoại lệ 
Tóm tắt 
¾ Bất cứ khi nào một lỗi xuất hiện trong khi thi hành chương trình, nghĩa là một 
ngoại lệ đã xuất hiện. 
¾ Ngoại lệ phát sinh vào lúc thực thi chương trình theo trình tự mã. 
¾ Mỗi ngoại lệ phát sinh ra phải bị bắt giữ , nếu không ứng dụng sẽ bị ngắt. 
¾ Việc xử lý ngoại lệ cho phép bạn kết hợp tất cả tiến trình xử lý lỗi trong một nơi. 
Lúc đó đoạn mã của bạn sẽ rõ ràng hơn. 
¾ Java sử dụng các khối ‘try’ và ‘catch’ để xử lý các ngoại lệ. Các câu lệnh trong 
khối ‘try’ chặn ngoại lệ còn khối ‘catch’ xử lý ngoại lệ. 
¾ Các khối chứa nhiều catch có thể được sử dụng để xử lý các kiểu ngoại lệ khác 
nhau theo cách khác nhau. 
¾ Từ khoá ‘throw’ liệt kê các ngoại lệ mà phương thức chặn. 
¾ Từ khoá ‘throw’ chỉ ra một ngoại lệ vừa xuất hiện. 
¾ Khối ‘finally’ khai báo các câu lệnh trả về nguồn tài nguyên cho hệ thống và in 
những câu thông báo. 

File đính kèm:

  • pdfUnlock-CoreJava_C7.pdf
Tài liệu liên quan