Bài giảng CoreJava - Chương VII: Xử lý ngoại lệ (Exception Handling)

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 khối xử lý ngoại lệ (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 lệ

 

doc14 trang | Chuyên mục: Java | Chia sẻ: yen2110 | Lượt xem: 595 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng CoreJava - Chương VII: Xử lý ngoại lệ (Exception Handling), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
{
}
Khi sử dụng các ‘try’ lồng nhau, khối ‘try’ bên trong được thi hành đầu tiên. Bất kỳ ngoại lệ nào bị chặn trong khối ‘try’ sẽ bị bắt giữ trong các khối ‘catch’ theo sau. Nếu khối ‘catch’ thích hợp không được tìm thấy thì các khối ‘catch’ của các khối ‘try’ bên ngoài sẽ được xem xét. Nếu không, Java Runtime Environment xử lý các ngoại lệ.
chương trình 7.1 minh họa cách sử dụng các khối ‘try’ và ‘catch’.
Chương trình 7.1
class TryClass
{
	public static void main(String args[])
	{
	int demo=0;
	try
	{
	System.out.println(20/demo);
	}
	catch(ArithmeticException 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à phép toán số học hợp lệ. Do đó một ngoại lệ xảy ra và được bắt giữ trong khối catch. Khi nhận biết được loại ngoại lệ nào có thể xảy ra, ta viết lệnh trong khối ‘catch’ tương ứng. Ở đây, ‘a’ được sử dụng như một đối tượng của ArithmeticException để in các chi tiết về ngoại lệ. 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:
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 lỗi nào 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 mà không được xử lý. 
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 hoàn thành. Nếu điều này xảy ra, thì các đoạn mã phía sau (ví dụ như đoạn mã có chức năng thu hồi tài nguyên, như các lệnh đóng tập viết ở 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 ResultSet (đượ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()’ gây ra ngoại lệ. Mặt khác ‘cleanup()’ cũng được gọi ngay khi không có ngoại lệ nào xảy ra và thực hiện tiếp phần sau khối lệnh ‘finally’.
Khối ‘finally’ là tuỳ ý, không bắt buộc. Khối này được đặt sau khối ‘catch’ cuối cùng. Chương trình sẽ thực thi câu lệnh đầu tiên của khối ‘finally’ ngay sau khi gặp câu lệnh ‘return’ hay lệnh ‘break’ 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ự thực hiện của các khối ‘try’, ‘catch’ và ‘finally’.
Hình 7.4 Khối lệnh ‘try’, ‘catch’ và ‘finally’
Chương trì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)
	{
	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 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ệ có thể được tạo ra bằng cách sử dụng từ khoá ‘throw’. Từ khóa ‘throw’ chỉ ra một ngoại lệ vừa xảy ra. Toán hạng của throw là một đối tượng thuộc lớp được thừa kế từ ‘Throwable’.
Đoạn lệnh sau chỉ ra cách sử dụng của lệnh ‘throw’:
try
{
	if (flag<0)
	{
	throw new MyException(); // user-defined
	}
}
Một phương thức có thể tạo ra nhiều ngoại lệ. Để làm được điều này này, ta chỉ cần liệt kê danh sách các ngoại lệ mà phương thức có thể tạo ra trong phần định nghĩ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()’ tạo ra một ngoại lệ nhưng không được xử lý. Trong trường hợp này, phương thức gọi ‘x()’ nên khai báo rằng nó có khả năng tạo ra ngoại lệ như ngoại lệ của 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 (phương thức gọi x()).
Đoạn mã sau minh họa cách sử dụng của từ khoá ‘throws’ để tạo nhiều ngoại lệ:
public class Example
{
	// Các ngoại lệ cách nhau bởi dấu phẩy
	public void exceptionExample() throws ExException, LookupException
	{
	try
	{
	// các lệnh
	}
	catch(ExException exmp)
	{
	}
	catch(LookupException lkpex)
	{
	} 
	}
}
Trong ví dụ trên, phương thức ‘exceptionExample’ có 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ể tạo ra – 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 có thể gây ra.
Lớp ‘Exception’ thực thi giao diện ‘Throwable’ và cung cấp các tính năng để làm việc với ngoại lệ. Nó có ý nghĩa trong trường hợp 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 việc thừa kế lớp Exception là loại ngoại lệ mới này có thể được 'catch' độc lập với 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;
	}
	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 để tạo ra ngoại lệ ‘ArraySizeException’ mà được chỉ ra bởi lệ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. 
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
Lỗi về số học, ví dụ như ‘chia cho 0’.
IllegalAccessException
Lớp không thể truy cập.
IllegalArgumentException
Đối số không hợp lệ.
ArrayIndexOutOfBoundsExeption
Lỗi tràn mảng.
NullPointerException
Khi truy cập đối tượng null.
SecurityException
Cơ chế bảo mật không cho phép thực hiện.
ClassNotFoundException
Không thể nạp lớp yêu cầu.
NumberFormatException
Việc chuyển đối từ chuỗi sang số thực không thành công. 
AWTException
Ngoại lệ về AWT
IOException
Lớp cha của các lớp 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 được xử lý, 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’ gây ra ngoại lệ còn khối ‘catch’ xử lý ngoại lệ.
Nhiều khối catch có thể được sử dụng để xử lý các loại ngoại lệ khác nhau.
Từ khoá ‘throws’ liệt kê các ngoại lệ mà phương gây ra.
Từ khoá ‘throw’ tạo ra một ngoại lệ.
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 thông báo.
Kiểm tra sự tiến bộ
Khi một ngoại lệ xảy ra, môt .........................đại diện cho ngoại lệ được tạo ra.
Lớp .......................là lớp cha của lớp Exception
Mô hình xử lý lỗi của Java được gọi là mô hình 'catch and throw'?	Đúng/Sai
Ưu điểm của mô hình 'catch and throw' là gì?
Khi sử dụng 'try' lồng nhau, 'try' ngoài sẽ được thực hiện trước? 	Đúng/Sai
Khối 'finally' đảm bảo luôn luôn được thực hiện cho dù có ngoại lệ xảy ra hay không? 	Đúng/Sai
Mỗi phương thức không có khả năng gây ra nhiều hơn một ngoại lệ. 
	Đúng/Sai
Ngoại lệ .................................... được tạo ra khi lớp không thể truy cập được.
Bài tập
Viết chương trình gây ra ngoại lệ khi người sử dụng không nhập tham số nào vào từ dòng lệnh. Chương trình phải hiện thị số tham số nếu có tham số được nhập vào từ dòng lệnh. Đầu ra của chương trình như sau:
Viết chương trình gây ra ngoại lệ, nếu không có số nào được nhập vào từ dòng lệnh. Ngược lại, chương trình hiển thị giá trị lập phương của số nhập vào như hình dưới đây:
Viết chương trình gây ra ngoại lệ nếu như lớp không thể truy nhập.

File đính kèm:

  • docbai_giang_corejava_chuong_vii_xu_ly_ngoai_le_exception_handl.doc
Tài liệu liên quan