Ệ
CÔNG NGH JAVA
Ả
Ỗ CH5. QU N LÝ L I VÀ GOM RÁC
Quang Dieu Tran PhD
1 1
03/06/18 03/06/18
Mục tiêu
• Định nghĩa được exception là gì. • Phân loại được các exception • Sử dụng được cú pháp
try..catch..finally
• Biết cách tự quản lý exception • Giải thích được cơ chế gom rác
của Java
2
03/06/18
Nội dung
1- Exception là gì? 2- Cấu trúc quản lý lỗi của Java 3- Mô hình try catch finally 4- Sử dụng throws 5- Tự định nghĩa exceptions 6- Cơ chế gom rác 7- Tóm tắt-trắc nghiệm-bài tập
3
03/06/18
Exception
• Java là ngôn ngữ mạnh, có nghĩa là tối thiểu hóa được lỗi và khi có lỗi thì chúng có thể được quản lý.
• Lỗi có 2 loại:
– Lỗi lúc biên dịch (compile-time error-lỗi cú
pháp)
– Lỗi lúc thực thi (run-time error- giải thuật sai,
không dự đoán được tình huống).
• Exception= runtime-error • Thí dụ: thực hiện phép chia mà mẫu số là
0
4
03/06/18
Exception
• Là 1 kiểu lỗi đặc biệt, xảy ra trong thời gian thực thi khối lệnh và có thể gây ngừng đột ngột chương trình. • Các lỗi thường gây nên biệt lệ:
– Tràn bộ nhớ – Lỗi cấp phát tài nguyên – Không tìm thấy file – Lỗi kết nối
03/06/18 5
Mục đích của việc xử lý
• Giảm thiểu việc kết thúc bất thường của
hệ thống và của chương trình.
• Ví dụ: khi đang thao tác trên 1 tập tin nếu gặp lỗi mà không xử lý và chương trình kết thúc đột ngột thì file sẽ không được đóng và có thể dẫn đến hư file và các nguồn tài nguyên sẽ không được giải phóng.
03/06/18 6
Java API Exception Hierachy
03/06/18 7
Cấu trúc các class quản lý lỗi của Java
• Exception: lớp nền của phân cấp exception. • RuntimeException: Lớp nền của nhiều
lớp
trong
java.lang.exceptions.
IllegalArgumentException : Lỗi sai đối số.
• ArithmaticException: Quản lý lỗi tóan học như chia cho 0. • • ArrayIndexOutOfBoundsException: Lỗi sai chỉ số của mảng • NullPointerException: Lỗi đã truy xuất 1 đối tượng chưa
khởi tạo
• SecurityException : Lỗi không được quyền truy cập. • ClassNotFoundException: Lỗi không thể nạp 1 lớp vì không
có lớp này
8
03/06/18
Cấu trúc các class quản lý lỗi của Java(tt)
IOException : Lớp nền của IO exception.
• NumberFormatException: Lỗi chuyển String ->float. • AWTException: Lỗi Abstract Windowing Toolkit • ArithmaticException: Quản lý lỗi tóan học như chia cho 0. • • FileNotFoundException: Lỗi không có file đã đặc tả • EOFException: Lỗi cố truy xuất dữ liệu mà file đã hết • IllegalAccessException : Lỗi truy xuất đến 1class bị cấm. • NoSuchMethodException: Lỗi không có method đã đặc tả •
InterruptedException: luồng bị ngắt
9
03/06/18
Quá trình xử lý lỗi
• Xác định loại lỗi và đoạn lệnh xảy ra lỗi • Xác định cơ chế bắt lỗi • Xác định vị trí đoạn lệnh cần viết để bắt lỗi • Xác định thông báo sẽ hiển thị nếu lỗi xảy
ra
• Viết đoạn lệnh xử lý lỗi • Lưu, biên dịch và chạy chương trình
03/06/18 10
Xử lý biệt lệ như thế nào?
• Khi 1 biệt lệ xảy ra thì một đối tượng
tương ứng sẽ được tạo ra.
• Đối tượng sẽ được truyền tới phương
thức nơi mà biệt lệ xảy ra.
• Đối tượng này chứa các thông tin chi tiết về biệt lệ, các thông tin này sẽ có thể được nhận và xử lý.
• Lớp “Throwable” của Java là lớp cha của
tất cả các biệt lệ
03/06/18 11
Biệt lệ
03/06/18 12
Mô hình xử lý biệt lệ
• Các mô hình dùng để xử lý biệt lệ:
– try-catch-finally – Throw / throws
03/06/18 13
Try-catch-finally
• Sử dụng khối try, catch, finally để bắt
giữ các ngoại lệ
Khối lệnh có thể ném ngoại lệ
Khối lệnh sẽ thực hiện nếu ngoại lệ xảy ra
Khối lệnh sẽ thực hiện bất chấp ngoại lệ xảy ra hay không
03/06/18 14
Try-catch-finally
03/06/18 15
Try-catch-finally
public static void method(String s) {
try {
String s =“mot”; System.out.println(Integer.parseInt(s));
} catch (NumberFormatException e) { System.out.println("wrong fomat");
} finally{
System.out.println(“String s = ”+s);
}
}
03/06/18 16
Throw và Throws
• Tóan tử throw cho phép chỉ thị 1 exception đã xẩy ra. Kết quả là 1 đối tượng của 1 lớp dẫn xuất của lớp Throwable.
• Tình huống: method X() gọi method Y(), Y() thực thi gây ra 1 exception mà không được quản lý, exception này lan về cho phương thức gọi là X() . Nếu trong X() cũng không quản lý lỗi Lỗi truyền về cho nơi đã gọi X()
• Cách giải quyết: a) Trong Y() có quản lý lỗi; b) Trong X() có có cấu trúc try…catch để quản lý
lỗi.
17
03/06/18
Throw và Throws
• Các biệt lệ được chặn bởi sự trợ giúp của
từ khóa throw.
• Throw giúp chỉ ra biệt lệ vừa xảy ra. • Toán hạng của throw là một đối tượng của
1 lớp mà lớp này được dẫn xuất từ Throwable try{ if (flag < 0){ throw new MyException( ) ; // user-defined }
}
03/06/18 18
Throw và Throws
• 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 biệt lệ.
• Một lớp con của lớp Exception là một biệt lệ mới có thể bắt giữ độc lập các Throwable khác nhau.
03/06/18 19
Throw và Throws
• Cú pháp sinh 1 Exception trong hàm ReturnType Method (…) throws ExceptionClass { if (…) throw ExceptionClass(“Message”); else { …… } }
20
03/06/18
Throw và Throws
• Một phương thức đơn có thể được chặn
bởi nhiều biệt lệ.
public class Example {
public void exceptionExample( ) throws ExException, LookupException {
try{
// statements
} catch(ExException exmp) { …. } catch(LookupException lkpex) { …. }
}
}
03/06/18 21
Dọn rác
• Java cung cấp cơ chế gom rác tự động Garbage collection mà người lập trình không cần phải quan tâm xử lý rác.
• Đối tượng khi không còn tham chiếu nào
tới nó nữa gom rác.
03/06/18 22
Cơ chế gom rác
• Hiện thực bằng heap động (xem lại chương
1).
• Dù có thủ công gọi trình gom rác bằng
System.gc() cũng không bảo đảm việc gom rác được thực thi ngay lập tức.
• Có thể thủ công tắt trình gom rác bằng chỉ thị java –noasyncgc File.class nhưng có thể phải trả giá là thiếu bộ nhớ do số đối tượng sinh ra trong chương trình khó tiên liệu Hiệu suất chương trình kém.
23
03/06/18
Cơ chế gom rác- finalize() method
• Java cung cấp phương thức finalize()
họat động như 1 Destructor của C++ để hủy các quá trình trước khi qúa trình trả điều khiển về cho hệ điều hành.
• Chú ý: Chỉ có đối tượng mới bị gom rác chứ tham khảo đến đối tượng không bị gom.
• Cú pháp: protected void finalize() throws
Throwable
24
03/06/18
Dọn rác: nulling a reference
• Cách đầu tiên để dọn rác là set tham
chiếu của đối tượng thành null
Garbage collection sẽ làm việc sau câu lệnh này
03/06/18 25
Ví dụ
03/06/18 26
Kết quả
Total JVM memory: 5177344 Before Memory = 4974672 After Memory = 4728504 After GC Memory = 5045864
03/06/18 27
Xử lý trước khi gom rác
• finally() methods:
– Giải phóng tài nguyên cấp phát trước khi gom
rác đối tượng.
– Không nên overridden lại phương thức này vì bạn không biết chắc chắn lúc nào hàm hủy sẽ được gọi.
03/06/18 28
Tóm tắt-trắc nghiệm-bài tập
1. 2. 3. 4.
5. 6. 7. 8.
9. 10.
Có hai lọai lỗi: Lỗi lúc biên dịch và lỗi khi thực thi. Lỗi biên dịch là lỗi ……………………… Lỗi lúc thực thi còn gọi là ……………….. Nếu không quản lý Exception, chương trình sẽ ngắt đột ngột và điều khiển được trả về cho …………………………………….. Hòan tòan có thể bẫy được các …………………………….. Quản lý exception cho phép xử lý lỗi đúng lúv (true/false) 5 từ khóa được dùng để bẫy lỗi : ………………………………….. Từ khóa throws cho phép dùng đối với các exception mà 1 hàm có thể xử lý (true/false) Từ khóa throw chỉ thị rằng 1 exception đã xẩy ra (true/false) Từ khóa finally chỉ thị nơi bắt đầu 1 khối phát biểu không phụ thuộc vào 1 lỗi có xẩy ra hay không (true./false) Ta có thể tự tạo ra 1 Exception class (true/false)
11. 12. System.gc() sẽ yêu cầu hệ thống …………………………..
29
03/06/18