1.Mở đầuXử lý ngoại lệ Exception Handling trong Java là một cơ chế mạnh mẽ, được thiết kế để giúp lập trình viên phát hiện, xử lý và khôi phục từ các tình huống lỗi một cách an toàn và h
Trang 1TRƯỜNG ĐẠI HỌC KINH TẾ - KỸ THUẬT CÔNG NGHIỆP
KHOA CÔNG NGHỆ THÔNG TIN
-o0o -BÀI TẬP LỚN
HỌC PHẦN: CÔNG NGHỆ JAVA
XỬ LÝ NGOẠI LỆ
Giảng viên hướng dẫn: Vũ Văn Đốc Nhóm thực hiện: Nhóm 8
Thành viên nhóm: Vũ Hoài Nam -22103100
Đinh Việt Tài - 22103100315 Nguyễn Văn Tâm - 22103100 Nguyễn Minh Đức - 22103100 Nguyễn Minh Đạt - 22103100
Lê Văn An - 22103100
Hà Nội,ngày 5 tháng 12 năm 2024
Trang 2Mục Lục
1.Mở đầu 3
2.Xử lí ngoại lệ 3
2.1 Ngoại lệ là gì? 3
2.2 Mô hình phân cấp 4
2.3 Checked và Unchecked Exception 5
2.4 Mô hình xử lí ngoại lệ 6
2.4.1 Khối try/catch 6
2.4.2 Bắt nhiều ngoại lệ(Khối có nhiều catch) 7
2.4.3 Khối Finally 8
2.5 Ném ngoại lệ 9
2.5.1 throw 9
2.5.2 sử dụng throws 10
3 Ngoại lệ do người dùng tự tạo 11
Trang 31.Mở đầu
Xử lý ngoại lệ (Exception Handling) trong Java là một cơ chế mạnh mẽ, được thiết kế để giúp lập trình viên phát hiện, xử lý và khôi phục từ các tình huống lỗi một cách an toàn và hiệu quả Thay vì để chương trình dừng đột ngột khi gặp lỗi, Java cung cấp các công cụ và cấu trúc giúp kiểm soát luồng thực thi, đảm bảo chương trình hoạt động ổn định ngay cả khi xảy ra ngoại lệ
Trong quá trình phát triển phần mềm, các lập trình viên thường phải đối mặt với những tình huống bất thường hoặc lỗi xảy ra khi chương trình đang chạy Những lỗi này, nếu không được xử lý đúng cách, có thể dẫn đến sự cố nghiêm trọng, làm gián đoạn hoạt động của phần mềm và gây mất dữ liệu hoặc trải nghiệm không tốt cho người dùng
Báo cáo này sẽ giới thiệu các khái niệm cơ bản, phân loại ngoại lệ, các từ khóa quan trọng như try, catch, finally, và cách áp dụng chúng vào thực tế thông qua các ví dụ cụ thể Hy vọng rằng tài liệu sẽ giúp bạn hiểu rõ hơn về cách xử lý ngoại lệ và áp dụng một cách hiệu quả trong các dự án phần mềm
Trang 42.Xử lí ngoại lệ
2.1 Ngoại lệ là gì?
Định nghĩa ngoại lệ: Ngoại lệ là các sự kiện không mong muốn hoặc lỗi
xảy ra trong quá trình thực thi chương trình Những lỗi này có thể bao gồm lỗi cú pháp, lỗi logic, hoặc các vấn đề ngoài ý muốn như chia cho số 0, truy cập vào mảng vượt quá giới hạn, hay thiếu tài nguyên hệ thống
VD: Ví dụ chương trình chia 2 số Nếu ta cho mẫu số = 0 thì phát sinh lỗi và đó được coi là 1 ngoại lệ
public static void main(String[] args) {
int a = 10;
int b = 0;
int result;
result = a/b;
System.out.println("a/b = " + result);
}
Sau khi chạy chương trình trên ta được kết quả:
2.2 Mô hình phân cấp
Trang 5 Object là lớp lớn nhất và cơ bản nhất, tất cả các lớp con trong java đều
kế thừa từ lớp cơ bản nhất là Object
Throwable là lớp cơ sở (superclass) cho tất cả các lỗi (errors) và ngoại
lệ (exceptions)
- 1 số phương thức cơ bản:
Throwable(String s) : Constructor này tạo 1 ngoại lệ với thông báo là s
getMessage() : Trả về thông báo chi tiết được cung cấp khi tạo đối tượng ngoại lệ
Lớp Exception
- Có nhiều ngoại lệ thuộc lớp con của Exception
- Có thể tạo ra các ngoại lệ kế thừa từ Exception
- Các lớp con:
IOException: Các lỗi liên quan đến nhập xuất, ví dụ đọc
hoặc ghi file
ClassNotFoundException:Xảy ra khi không tìm thấy lớp
cần thiết
RuntimeException là 1 nhánh con của Exception chứa
các UncheckException
-ArithmeticException: Lỗi toán học , ví dụ chia cho 0 NullPointerException: Lỗi truy cập đối tượng khi tham
-chiếu là Null
-IndexOutOfBoundsException:Lỗi truy cập phần tử vượt
ngoài giới hạn mảng
- IllegalArgumentException:Lỗi khi một phương thức
nhận tham số không hợp lệ
Lớp Error
- Chỉ những vấn đề nghiêm trọng và không dự đoán trước được như: LinkageError,VirtualMachineError…
- Các ngoại lệ kiểu Error ít được xử lí
Trang 62.3 Checked và Unchecked Exception
Checked Exception
- Là những ngoại lệ được kiểm tra tại thời điểm biên dịch và cần được xử lí ngay()
- Nếu không được xử lí hay khai báo bằng từ khóa throw sẽ không biên dịch được
VD: Cố gắng đọc 1 tệp tin không tồn tại
public static void main(String[] args) {
File file = new File("nonexistentfile.txt");
//tệp tin không tồn tại
FileReader fr = new FileReader(file);
}
Ta sẽ nhận được thông báo lỗi :
Unchecked Exception
- Là những ngoại lệ không được kiểm tra tại thời điểm biên dịch mà xảy ra tại thời điểm chạy
- Gồm RuntimeException và các lớp con của nó
VD: Truy cập phương thức trên đối tượng null
public static void main(String[] args) { String str = null;
System.out.println("do dai chuoi = " + str.length()); }
Kết quả nhận được kết quả sau khi chạy chương trình:
2.4 Mô hình xử lí ngoại lệ
Trang 72.4.1 Khối try/catch
- Khi xảy ra lỗi trong chương trình, hệ thống Java Runtime mặc định sẽ
xử lý ngoại lệ bằng cách dừng chương trình và in ra một "stack trace" (danh sách các lời gọi hàm dẫn đến lỗi)
- Chương trình sẽ bị dừng đột ngột và đây là điều mà cả user và developer đều không muốn
- Để xử lý ta có thể dùng try…catch để bắt và xử lí lỗi
Cấu trúc:
Try{
//Khối lệnh phát sinh ngoại lệ }catch(Exception e){
//Xử lí khi chương trình gặp ngoại lệ }
Ví dụ: Chương trình thực hiện phép chia
public static void main(String[] args) {
int tuso, mauso;
int result;
Scanner sc = new Scanner(System.in);
try{
System.out.print("tu so = "); tuso = sc.nextInt();
System.out.print("mau so = "); mauso = sc.nextInt();
result = tuso/mauso;
System.out.println("ket qua = " + result);
}catch(Exception e){
System.out.println("Mau so phai != 0");
}
}
Kết quả ta thu được sau khi thử với tuso = 10 và mauso = 0;
Trang 8Ở ví dụ trên Exception mà ta catch được là ArithmeticException Trong trường hợp đã đoán được Exception có thể xảy ra ta có thể viết:
catch(“tên Exception” e) // ở vd này là catch(ArithmeticException e).
2.4.2 Bắt nhiều ngoại lệ(Khối có nhiều catch)
- Thực tế có thể xảy nhiều Exception khác nhau và để xử lí ta có thể dùng nhiều khối catch, mỗi khối để xử lí 1 ngoại lệ
try {
// Mã có thể ném ra ngoại lệ
} catch (ExceptionType1 e1) {
// Xử lý ngoại lệ loại ExceptionType1
} catch (ExceptionType2 e2) {
// Xử lý ngoại lệ loại ExceptionType2
} catch (Exception e) {
// Xử lý ngoại lệ chung (nếu không thuộc các loại trên)
}
Lưu ý: khối catch dành cho lớp ngoại lệ tổng quát hơn bao giờ cũng phải đặt sau khối catch dành cho lớp ngoại lệ chuyên biệt hơn Trình biên dịch
sẽ báo lỗi nếu ta không tuân theo quy tắc này
- VD:Chương trình thực hiện phép chia
public static void main(String[] args) {
int tuso, mauso, result;
Scanner sc = new Scanner(System.in);
Trang 9try{
System.out.print("tu so = ");tuso = sc.nextInt();
System.out.print("mau so = "); mauso = sc.nextInt();
result = tuso/mauso;
System.out.println("ket qua = " + result);
}catch(ArithmeticException e){
System.out.println("Mau so phai != 0");
}catch(InputMismatchException e){
System.out.println("Khong nhap ki tu hoac mot chuoi cho tu so va mau so");
}
}
Ở đây ta thấy có 2 Exception có thể xảy ra đó là ArithmeticException và InputMismatchException và cách xử lí ở đây là ta sử dụng nhiều khối catch cho từng Exception riêng biệt
2.4.3 Khối Finally
- Khối mã luôn được thực thi bất kể ngoại lệ có xảy ra hay không
- Finally thường được sử dụng để dọn dẹp tài nguyên:
Đóng file
Giải phóng bộ nhớ
Ngắt kết nối cơ sở dữ liệu
Hoặc bất kỳ tài nguyên nào khác cần được giải phóng
VD:
public static void main(String[] args) {
try {
System.out.println("running try ");
System.out.println("10/0 = " + 10/0); // Lỗi chia cho 0
Trang 10} catch (ArithmeticException e) {
System.out.println("run error ");
} finally {
System.out.println("running finally");
}
Ta có thể thấy khối finally sẽ luôn chạy kể cả khi có ngoại lệ hay không có ngoại lệ
2.5 Ném ngoại lệ
2.5.1 Throw
- Sử dụng khi muốn ném lỗi trực tiếp(không dùng try/catch)
- Ví dụ:
public static void truyCapPtuMang(int a[],int index){
if(index >= a.length){
throw new ArrayIndexOutOfBoundsException("Ptu nam ngoai pvi mang!");
}
else{
System.out.println("ptu tai vi tri "+index+" = "+a[index]); }
}
public static void main(String[] args) {
int arr[] = {1,2,3};
truyCapPtuMang(arr,arr.length);
}
Kết quả sau khi chạy chương trình:
Trang 112.5.2 Sử dụng throws
- Ngoài việc xử lí ngoại lệ trực tiếp try/catch, chúng ta có thể dùng Throws để ném ra ngoại lệ
=> Có tác dụng rất nhiều khi viết function/class tổng quát(để re-use) vì chúng
ta không biết nên làm gì với try/catch
VD:
public static void docFile (String tenFile) throws FileNotFoundException{ FileReader reader = new FileReader(tenFile);
}
Ở VD trên ta có thể thấy từ khóa throws đã được sử dụng Và khi đã sử dụng throws để khai báo phương thức docFile sẽ gây ra FileNotFoundException thì trình biên dịch sẽ không bắt ta phải xử lí checked Exception này ngay tại thời điểm đó nữa, việc xử lí sẽ bắt buộc khi ta sử dụng phương thức này
3 Ngoại lệ do người dùng tự tạo
- Ngoại lệ do người dùng tự tạo (custom exceptions) là các ngoại lệ được định nghĩa bởi lập trình viên để xử lý các tình huống cụ thể trong ứng dụng mà các ngoại lệ chuẩn không thể bao quát hết Việc tạo ra các ngoại lệ tùy chỉnh giúp mã nguồn trở nên rõ ràng và dễ bảo trì hơn
- Để tự tạo 1 ngoại lệ bạn cần:
// Tạo lớp ngoại lệ tùy chỉnh bằng cách kế thừa từ Exception
public class MyCustomException extends Exception {
// Constructor để truyền thông báo ngoại lệ
public MyCustomException(String message) {
super(message); // Gọi constructor của lớp cha (Exception) }
}
- VD:
class InvalidAgeException extends Exception{
public InvalidAgeException(String message){
Trang 12super(message);
}
}
public class EnterAge {
public static void checkAge(int age) throws InvalidAgeException{ if(age <= 0){
throw new InvalidAgeException("Tuoi phai > 0");
}
else{
System.out.println("age = " + age);
}
}
public static void main(String[] args) {
int age;
Scanner sc = new Scanner(System.in);
try{
age = sc.nextInt();
checkAge(age);
}catch(InvalidAgeException e){
System.out.println(e.getMessage());
}
}
}
- Ở VD trên ta có 1 Exception tự tạo đó là InvalidAgeException