Tải bản đầy đủ (.pdf) (28 trang)

ObjectOriented Programming in Java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (6.28 MB, 28 trang )

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI JAVA
(Object-Oriented Programming in Java)

1


NỘI DUNG MƠN HỌC







Tổng quan về OOP
Ngơn ngữ lập trình Java
Lớp (Class) và Đối tượng (Object)
Tính kế thừa (Inheritance)
Đa hình (Polymorphism)
Tính đóng gói (Encapsulation) và gói
(Package)
• Lớp trừu tượng và Interface
• Ngoại lệ và xử lý ngoại lệ

2


Ngoại lệ và xử lý ngoại lệ







Ngoại lệ (Exception)
Bắt và xử lý ngoại lệ
Ủy nhiệm ngoại lệ (Ném ngoại lệ)
Né ngoại lệ
Tự định nghĩa ngoại lệ

3


Ngoại lệ
• Ngoại lệ (exception): là một sự kiện xảy ra trong
quá trình thực thi chương trình, phá vỡ luồng
binh thường của chương trình
– VD: Phép tốn chia cho 0; ghi file khi chưa mở file

• Ngoại lệ là một lỗi đặc biệt và xảy ra tại thời
điểm chạy chương trình (run-time);
• Khi xảy ra ngoại lệ, nếu khơng xử lý thì chương
trình dừng và trả lại quyền điều khiển cho hệ
điều hành

4


Ngoại lệ
• VD: Chia cho số 0 => Lỗi quá trình run-time
import java.util.Scanner;

public class ExceptionTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("Nhap so bi chia:");
int soBiChia=sc.nextInt();
System.out.println("Nhap so chia:");
int soChia=sc.nextInt();
double ketQua= soBiChia/soChia;
System.out.printf("Ket qua cua phep chia %d / %d= %.2f\n",soBiChia,soChia,ketQua);
}

5


Ngoại lệ
• VD: Mở file => Lỗi biên dịch (compile)
import java.io.File;
import java.io.PrintWriter;
import java.util.Scanner;
class FileWriter {
public static void write(String fileName, String s) {
File file = new File(fileName);
PrintWriter pw = new PrintWriter(file);
pw.println(s);
pw.close();
}

}

6



Ngoại lệ
• Cách xử lý lỗi truyền thống
– Viết mã xử lý tại nơi phát sinh ra lỗi
• Làm cho chương trình trở nên phức tạp, rối
• Khơng phải lúc nào cũng đầy đủ thơng tin để xử lý;
• Khơng nhất thiết phải xử lý

– Truyền trạng thái lên mức trên
• Thơng qua tham số, giá trị trả lại hoặc biến tổng thể
• Dễ nhầm
• Vẫn cịn khó hiểu

• Nhược điểm:
– Khó kiểm sốt hết các trường hợp: lỗi số học, lỗi bộ
nhớ;
– Lập trình viên thường qun khơng xử lý lỗi

7


Bắt và xử lý ngoại lệ
• Mục đích:
– Giúp chương trình đáng tin cậy hơn và tránh dừng
bất thường;
– Tách biệt khối lệnh có thể gây ngoại lệ và khối lệnh
xử lý ngoại lệ
– Tránh việc lan truyền lỗi trong dây chuyền các lời gọi
hàm

– Cho phép tập trung viết code cho luồng chính và xử
lý trường hợp bất thường nới khác

8


Bắt và xử lý ngoại lệ
• Mơ hình xử lý ngoại lệ - hướng đối tượng
– Đóng gói các điều kiện không mong đợi trong một đối
tượng
– Khi xảy ra ngoại lệ, đối tượng tương ứng với ngoại lệ
được tạo ra chứa thông tin chi tiết về ngoại lệ;
– Cung cấp cơ chế hiệu quả trong việc xử lý lỗi
– Tách biệt luồng điều khiển bất thường và luồng bình
thường
– Ngoại lệ cần phải được xử lý ở tại phương thức sinh
ra ngoại lệ hoặc ủy nhiệm cho phương thức gọi đến

9


Bắt và xử lý ngoại lệ
• Mơ hình xử lý ngoại lệ - hướng đối tượng
– Mỗi ngoại lệ là một đối tượng của cây phả hệ
Exception
– Tất cả các ngoại lệ đều là thể hiện của một lớp thừa
kế từ lớp Throwable hoặc các lớp con của nó;
– Các đối tượng này có nhiệm vụ chuyển thơng tin về
ngoại lệ (loại, trạng thái của chương trình) từ vị trí xảy
ra ngoại lệ đến nới quản lý/xử lý nó

– Từ khóa: try; catch; finally; throw; throws

10


11


Khối try/catch
• Khối try/catch: phân tách đoạn chương trình thơng
thường và phần cần xử lý ngoại lệ
– Try {…}: Khối lệnh có khả năng xảy ra ngoại lệ
– Catch{…}: Bắt và xử lý ngoại lệ
Try{
//Khối lệnh có thể xảy ra ngoại lệ
}
Catch(ExceptionType e){
//Xử lý ngoại lệ
}
Try{
//Khối lệnh có thể xảy ra ngoại lệ
}
Catch(ExceptionType1 e){
//Xử lý ngoại lệ
}
Catch(ExceptionType2 e){
//Xử lý ngoại lệ
}
Catch(ExceptionType3 e){
//Xử lý ngoại lệ

}

12


Khối try/catch

13


Khối try/catch…
• Bắt nhiều ngoại lệ

14


Khối try/catch…
• Hoạt động của khối try/catch: Khi chạy một
lệnh/phương thức có thể có ngoại lệ, một trong
hai trường hợp xảy ra:
– Phương thức được gọi thành công: Khối catch bị bỏ
qua vì khơng có ngoại lệ nào để xử lý
– Phương thức ném ra ngoại lệ và khối catch:
• Bắt được ngoại lệ đó: Trong khối try ở sau lệnh có
ngoại lệ bị bỏ qua, chuyển tới khối catch xử lý
• Khơng bắt được ngoại lệ đó: Nếu khơng có khối finally
thì điều khiển sẽ nhảy khỏi chương trình (bỏ qua phần
cịn lại sau lệnh có ngoại lệ và ra khỏi phương thức
hiện tại)
15



Bắt và xử lý ngoại lệ
• VD: Xử lý ngoại lệ lỗi chia cho 0
import java.util.Scanner;
public class ExceptionTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Nhap so bi chia:");
int soBiChia = sc.nextInt();
System.out.println("Nhap so chia:");
int soChia = sc.nextInt();
try {
double ketQua = soBiChia / soChia;
System.out.printf("Ket qua cua phep chia %d / %d= %.2f\n", soBiChia, soChia, ketQua);
} catch (ArithmeticException e) {
System.out.println("Arithmetic Error");
}
}

16


Bắt và xử lý ngoại lệ
• VD: Xử lý ngoại lệ lỗi nhập và chia cho 0
import java.util.Scanner;
import java.util.InputMismatchException;
public class ExceptionTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

try {
Scanner sc = new Scanner(System.in);
System.out.println("Nhap so bi chia:");
int soBiChia = sc.nextInt();
System.out.println("Nhap so chia:");
int soChia = sc.nextInt();
double ketQua = soBiChia / soChia;
System.out.printf("Ket qua cua phep chia %d / %d= %.2f\n", soBiChia, soChia, ketQua);

}
catch (InputMismatchException e) {
System.out.println(“Input Error");
}
catch (ArithmeticException e) {
System.out.println("Arithmetic Error");
}
}

17


Bắt và xử lý ngoại lệ
• VD: Xử lý ngoại lệ lỗi đọc/ghi file
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
class FileWriter {
public static void write(String fileName, String s) {
try{

File file = new File(fileName);
PrintWriter pw = new PrintWriter(file);
pw.println(s);
pw.close();
} catch(FileNotFoundException e){
e.printStackTrace();
}
}
}

18


Khối finally
• Là nơi đặt các đoạn mã phải được thực thi bất
kể ngoại lệ đó có xảy ra hay khơng
• Lắp khối finally ở phần cuối của khối try/catch
• Cú pháp:
Try{
//Khối lệnh có thể xảy ra ngoại lệ
}
Catch(ExceptionType1 e1){
//Xử lý ngoại lệ
}
Catch(ExceptionType2 e2){
//Xử lý ngoại lệ
}
Catch(ExceptionType3 e3){
//Xử lý ngoại lệ
}

finally{

}

19


Khối finally

20


Khối try/catch...
• Ngoại lệ cũng là các đối tượng nên có tính Đa hình.
Do đó, trong một khối try/catch dành cho ngoại lệ
lớp cha cũng bắt được ngoại lệ lớp con.
• Catch(InputMismatchException e){…}: chỉ bắt được
InputMismatchException
• Catch (IOException e){…}: bắt tất cả ngoại lệ của kiểu
IOException, trong đó có InputMismatchException
• Catch(Exception e){…}: bắt tất cả ngoại lệ của
Exception, trong đó có IOException

• Trình biên dịch Java sẽ u cầu thứ tự cho khối
catch là: Khối catch dành cho ngoại lệ tổng quát
hơn bao giờ cũng phải đặt sau khối catch dành cho
21
lớp ngoại lệ chuyên biệt hơn



Khối try/catch...

Try{
//Khối lệnh có thể xảy ra ngoại lệ
}
Catch(InputMismatchException e){
//Xử lý ngoại lệ
}
Catch(IOException e){
//Xử lý ngoại lệ
}
Catch(Exception e){
//Xử lý ngoại lệ
}

22


Ủy nhiệm ngoại lệ (Ném ngoại lệ)
• Đơi khi trong chương trình có một phương thức
có khai báo một ngoại lệ, và phương thức đó
ném ngoại lệ tới đoạn chương trình gọi (sử
dụng) nó;
• Hai việc cần phải làm:
– Tun bố tại dịng khai báo phương thức rằng có thể
ném loại ngoại lệ đó: dùng từ khóa “throws”
– Tạo một ngoại lệ và ném nó tại một tình huống phù
hợp trong khối nội dung phương thức: dùng từ khóa
“throw”


23


Ủy nhiệm ngoại lệ (Ném ngoại lệ)
• Từ khóa throws/throw cho phép bạn tự phát
sinh ra ngoại lệ để try/catch bắt được
Tun bố phương thức này có
• VD:
thể có ngoại lệ
ArithmeticException
double div(int a, int b) throws ArithmeticException {
if(b == 0) {
throw new ArithmeticException("Loi chia cho so 0");
} else {
return a / b;
}
}

Tạo một đối tượng
ArithmeticException mới và
ném nó tới nơi gọi (sử dụng)


24


Lan truyền ngoại lệ (Né ngoại lệ)
• Đơi khi, trong chương trình có lời gọi phương
thức, mà phương thức đó có thể có ngoại lệ.
Phương thức đó khơng muốn xử lý ngoại lệ bằng

cách ‘né’ với khai báo từ khóa “throws” cho loại
ngoại lệ đó khi viết định nghĩa phương thức;
• Ngoại lệ sẽ được chuyển tới phương thức gọi
(caller), có thể ngoại lệ lại được ‘né’ tiếp
• Việc ‘né’ chỉ là trì hỗn, nếu khơng cuối cùng (tuy
trình biên dịch cho qua) máy áo Java sẽ ngắt
chương trình như những trường hợp ngoại lệ
không được xử lý.
25


×