Bài giảng Nhập môn lập trình Java - Bài 7: Xử lý ngoại lệ (Exception) - Võ Tấn Dũng

• Xử lý lỗi và ngoại lệ

• Khối try/catch/finally

• Các lớp ngoại lệ

• Xây dựng lớp ngoại lệ

• Lan truyền ngoại lệ

• Tung lại ngoại lệ

• Bài tập

 

pdf 35 trang yennguyen 3920
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nhập môn lập trình Java - Bài 7: Xử lý ngoại lệ (Exception) - Võ Tấn Dũng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Nhập môn lập trình Java - Bài 7: Xử lý ngoại lệ (Exception) - Võ Tấn Dũng

Bài giảng Nhập môn lập trình Java - Bài 7: Xử lý ngoại lệ (Exception) - Võ Tấn Dũng
GIẢNG VIÊN:
VÕ TẤN DŨNG
TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM
NHẬP MÔN JAVA
BÀI 7
XỬ LÝ NGOẠI LỆ
(EXCEPTION)
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g
2• Xử lý lỗi và ngoại lệ
• Khối try/catch/finally
• Các lớp ngoại lệ
• Xây dựng lớp ngoại lệ
• Lan truyền ngoại lệ
• Tung lại ngoại lệ
• Bài tập
NỘI DUNG TRÌNH BÀY
3• Trong một số ngôn ngữ như C, việc xử lý lỗi 
thường được cài đặt ngay tại các bước thực hiện 
của chương trình. Các hàm sẽ trả về một cấu 
trúc lỗi khi gặp lỗi.
• Ví dụ: Tìm kiếm phần tử trong một danh sách
ErrorStruct error = new ErrorStruct();
TableEntry entry = lookup(“Marianna”, employee, error);
if (entry == null)
{
return error;
}
XỬ LÝ LỖI VÀ NGOẠI LỆ
4 Mã lệnh và mã xử lý lỗi nằm xen kẽ khiến lập 
trình viên khó theo dõi được thuật toán chính 
của chương trình.
 Khi một lỗi xảy ra tại hàm A, tất cả các lời gọi 
hàm lồng nhau đến A đều phải xử lý lỗi mà A 
trả về.
XỬ LÝ LỖI VÀ NGOẠI LỆ
5• Trong Java, việc xử lý lỗi có thể được cài đặt 
trong một nhánh độc lập với nhánh chính của 
chương trình.
• Lỗi được coi như những trường hợp ngoại lệ 
(exceptional conditions). Chúng được bắt/ném 
(catch and throw) khi có lỗi xảy ra.
=> Một trường hợp lỗi sẽ chỉ được xử lý tại nơi 
cần xử lý.
=> Mã chính của chương trình sáng sủa, đúng 
với thiết kế thuật toán.
XỬ LÝ LỖI VÀ NGOẠI LỆ
6import java.awt.Point;
public class MyArray 
{
public static void main(String[ ] args) {
System.out.println("Goi phuong thuc methodeX()");
methodeX();
System.out.println("Chuong trinh ket thuc binh thuong");
}
public static void methodeX() {
Point[ ] pts = new Point[10];
for(int i = 0; i < pts.length; i++) {
pts[i].x = i;
pts[i].y = i+1;
}
}
}
VÍ DỤ 1
7Goi phuong thuc methodeX()
Exception in thread "main" java.lang.NullPointerException
at MyArray.methodeX(MyArray.java:14)
at MyArray.main(MyArray.java:7)
Giải thích: Hệ thống đã tung ra một exception thuộc lớp 
NullPointerException khi gặp lỗi. Sau đó chương trình kết 
thúc.
KẾT QUẢ THỰC THI VÍ DỤ 1
8public class MyDivision {
public static void main(String[ ] args) {
System.out.println("Goi phuong thuc A()");
A();
System.out.println("Chuong trinh ket thuc binh thuong");
}
public static void A() {
B();
}
public static void B() {
C();
}
public static void C() {
float a = 2/0;
}
}
VÍ DỤ 2
9Goi phuong thuc A()
Exception in thread "main" java.lang.ArithmeticException: / by zero
at MyDivision.C(MyDivision.java:14)
at MyDivision.B(MyDivision.java:11)
at MyDivision.A(MyDivision.java:8)
at MyDivision.main(MyDivision.java:4)
Giải thích: Phương thức A() gọi B(), B() gọi C(), C() gây ra lỗi 
chia cho 0 và hệ thống “ném” ra một exception thuộc lớp 
ArithmeticException. Sau đó chương trình kết thúc.
KẾT QUẢ THỰC THI VÍ DỤ 2
10
• Khi một phương thức gặp lỗi nào đó, ví dụ 
như chia không, vượt kích thước mảng, 
mở file chưa tồn tại thì các ngoại lệ sẽ 
được ném ra. Chương trình dừng lại ngay 
lập tức, toàn bộ phần mã phía sau sẽ 
không được thực thi.
• Java hỗ trợ cách thức để xử lý ngoại lệ 
(exception handling) tuỳ theo nhu cầu của 
chương trình.
NGOẠI LỆ
11
• Khối try/catch
– Đặt đoạn mã có khả năng xảy ra ngoại lệ 
trong khối try
– Đặt đoạn mã xử lý ngoại lệ trong khối catch
– Khi xảy ra ngoại lệ trong khối try, các câu 
lệnh trong khối catch sẽ được thực hiện tuỳ 
vào kiểu của ngoại lệ.
– Sau khi thực hiện xong khối catch, điều 
khiển sẽ được trả lại cho chương trình.
XỬ LÝ NGOẠI LỆ
12
• Ví dụ 1:
try
{
methodeX();
System.out.println(“Cau lenh ngay sau methodX()”); 
}
catch (NullPointerException e)
{
System.out.println(“Co loi trong khoi try”);
}
System.out.println(“Cau lenh sau try/catch”);
KHỐI TRY/CATCH
13
try {
x = System.in.read();
System.out.println(“x = “ + x);
} catch (IOException e) {
System.out.println(“Error: “ + e.getMessage());
}
try {
A();
} catch (Exception e) {
System.out.println(“Co loi trong A()”);
}
• Ví dụ 2:
• Ví dụ 3:
KHỐI TRY/CATCH
14
try 
{
String s = buff.readLine();
int a = Integer.parseInt(s);
x[i++] = a;
} catch (IOException e) {
System.out.println(“Error IO: “ + e.getMessage());
} catch (NumberFormatException e) {
System.out.println(“Error Format: “ + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(“Error Index: “ + e.getMessage());
}
• Ví dụ 4:
KHỐI TRY/CATCH
15
• Khi một ngoại lệ xảy ra, chương trình dừng lại, 
một số công việc “dọn dẹp” có thể sẽ không 
được thực hiện (ví dụ như đóng file).
• Khối finally đảm bảo rằng các câu lệnh trong 
đó luôn được thực hiện, kể cả khi ngoại lệ xảy 
ra.
try 
{
doSomething(); // phương thức này có thể gây ra ngoại lệ
} finally {
cleanup();
}
KHỐI FINALLY
16
• Các ngoại lệ xảy ra khi gặp lỗi.
• Có thể bắt và xử lý các ngoại lệ bằng cách sử 
dụng khối try/catch. Nếu không chương trình 
sẽ kết thúc ngay (với ứng dụng console) hoặc 
tiếp tục tồn tại (với ứng dụng GUI).
• Khi bắt ngoại lệ, phải biết rõ kiểu ngoại lệ cần 
bắt. Có thể dùng kiểu cha Exception.
• Để chắc chắn việc “dọn dẹp” luôn được thực 
hiện, dùng khối finally. Có thể kết hợp 
try/catch/finally.
TÓM TẮT VỀ XỬ LÝ NGOẠI LỆ
17
ClassNotFoundException
Throwable
Error Exception
RuntimeExceptionAssertionError IOException
Object
NullPointerException ArithmeticException
MỘT SỐ LỚP NGOẠI LỆ
18
• Lớp Throwable
– Có một biến String để lưu thông tin chi tiết về 
ngoại lệ đã xảy ra
– Một số phương thức cơ bản
• Throwable(String s); // Tạo một ngoại lệ có tên là 
s.
• String getMessage(); // Lấy thông tin về ngoại lệ
• void printStackTrace(); // In ra tất cả các thông tin 
liên quan đến ngoại lệ
MỘT SỐ LỚP NGOẠI LỆ
19
• Lớp Exception
– Có nhiều ngoại lệ thuộc lớp con của 
Exception.
– Người dùng có thể tạo ra các ngoại lệ kế 
thừa từ Exception.
• Lớp Error
– Chỉ những lỗi nghiêm trọng và không dự 
đoán trước được như ThreadDead, 
LinkageError, VirtualMachineError...
– Các ngoại lệ kiểu Error ít được xử lý.
MỘT SỐ LỚP NGOẠI LỆ
20
• RuntimeException: Chỉ các ngoại lệ có thể 
xảy ra khi JVM thực thi chương trình
– NullPointException: con trỏ null
– OutOfMemoryException: hết bộ nhớ
– ArithmeticException: lỗi toán học, lỗi chia 
không
– ClassCastException: lỗi ép kiểu
– ArrayIndexOutOfBoundsException: vượt quá 
chỉ số mảng
– ...
MỘT SỐ LỚP NGOẠI LỆ
21
• Ngoại lệ unchecked
– 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
– 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.
HAI LOẠI NGOẠI LỆ
22
• Giả sử method1 gọi method2 và method2 
là phương thức có khả năng ném ngoại lệ 
kiểu checked, lúc đó:
– hoặc method2 phải nằm trong khối try/catch.
– hoặc phải khai báo method1 có khả năng 
ném (throws) ngoại lệ.
CHÚ Ý VỚI NGOẠI LỆ CHECKED
23
• Cách 1: try/catch
public static void main(String[] args)
{
try {
String s = buff.readLine();
} catch (IOException e) {
...
}
}
• Cách 2: Khai báo throws
public static void main(String[ ] args) throws IOException
{
String s = buff.readLine();
}
VÍ DỤ (NGOẠI LỆ IOException)
24
• Bài 1: Cài đặt xử lý các ngoại lệ cho 
chương trình tính thương 2 số bằng giao 
diện GUI.
• Bài 2: Cài đặt xử lý lỗi bằng cách dùng 
ngoại lệ cho ví dụ ở phần đầu bài.
Bài tập
25
• Định nghĩa lớp ngoại lệ
// file MyException.java
public class MyException extends Exception
{
public MyException(String msg)
{
super(msg);
}
}
NGOẠI LỆ DO NGƯỜI DÙNG TẠO
26
• Sử dụng ngoại lệ
// file ExampleException.java
public class ExampleException 
{
public void copy(String fileName1, String fileName2) 
throws MyException 
{
if (fileName1.equals(fileName2)) 
throw new MyException("File trung ten"); // tung ngoại lệ
System.out.println("Copy completed");
}
Khai báo khả năng tung ngoại lệ
Tung ngoại lệ
NGOẠI LỆ DO NGƯỜI DÙNG TẠO
27
• Sử dụng ngoại lệ
public static void main(String[] args) 
{
ExampleException obj = new ExampleException();
try {
String a = args[0];
String b = args[1];
obj.copy(a,b);
} catch (MyException e) {
System.out.println(e.getMessage());
}
}
}
NGOẠI LỆ DO NGƯỜI DÙNG TẠO
28
• Tình huống
– Giả sử trong main() gọi phương thức A(), 
trong A() gọi B(), trong B() gọi C(). Khi đó một 
ngăn xếp các phương thức được tạo ra.
– Giả sử trong C() xảy ra ngoại lệ.
LAN TRUYỀN NGOẠI LỆ
29
C()
B()
A()
main()
B()
A()
main()
C() tung ngoại lệ
Nếu C() gặp lỗi và tung ra ngoại lệ nhưng trong C() lại không xử lý 
ngoại lệ này, thì chỉ còn một nơi có thể xử lý chính là nơi mà C() được 
gọi, đó là trong phương thức B(). Nế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ệ.
Nếu đến main() cũng không xử lý ngoại lệ được tung từ C() thì 
chương trình sẽ phải dừng lại.
LAN TRUYỀN NGOẠI LỆ
30
• Trong khối catch, ta có thể không xử lý trực 
tiếp ngoại lệ mà lại ném lại ngoại lệ đó cho 
nơi khác xử lý.
catch (IOException e) {
throw e;
}
• 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ệ (nếu là loại checked).
NÉM LẠI NGOẠI LỆ
31
• Không nên sử dụng ngoại lệ thay cho các 
luồng điều khiển trong chương trình. 
– Ví dụ: Kiểm tra delta trong chương trình giải 
phương trình bậc 2.
• Nên thiết kế và sử dụng ngoại lệ một cách 
thống nhất cho toàn bộ dự án.
• Một số xử lý lỗi bằng ngoại lệ phổ biến là: hết 
bộ nhớ, vượt quá chỉ số mảng, con trỏ null, 
chia cho 0, đối số không hợp lệ...
CHÚ Ý KHI SỬ DỤNG NGOẠI LỆ
32
1. Viết chương trình cho phép tính giá trị của biểu 
thức:
A = 
Yêu cầu xử lý các ngoại lệ có thể xảy ra.
2. Viết chương trình cho phép tạo một mảng 2 
chiều cỡ mxn với m,n nhập từ bàn phím. Cài 
đặt các xử lý ngoại lệ cần thiết.
5x - y 
2x + 7y 
BÀI TẬP
33
3. Xây dựng lớp ngoại lệ DateException cho các 
lỗi về ngày tháng.
4. Viết chương trình cho phép người dùng nhập 
vào ngày, tháng năm, nếu thông tin này không 
hợp lệ sẽ tung ra một ngoại lệ DateException, 
sau đó thông báo cho người nhập biết và cho 
phép người dùng nhập lại.
BÀI TẬP
34
5. Tìm hiểu lại lớp Candidate đã học (dữ liệu 
gồm mã thí sinh, tên và điểm thi 3 môn). Điều 
gì sẽ xảy ra khi tạo một đối tượng thuộc lớp 
Candidate với dữ liệu đưa vào không hợp lệ ? 
Cài đặt lớp CandidateException để bắt các lỗi 
như trên. Yêu cầu khi có lỗi thì sẽ cho biết cả 
tên và mã thí sinh bị lỗi.
BÀI TẬP 5
HẾT
BÀI 7
G
V
: 
V
õ
 T
ấ
n
 D
ũ
n
g

File đính kèm:

  • pdfbai_giang_nhap_mon_lap_trinh_java_bai_7_xu_ly_ngoai_le_excep.pdf