Định nghĩa Lập trình hướng Đối tượng (Objectoriented Programming).Nhận thức về Trừu tượng hóa Dữ liệu (Data Abstraction).Định nghĩa một Lớp (Class).Định nghĩa một Đối tượng (Object).Nhận thức được sự khác biệt giữa Lớp và Đối tượng.Nhận thức được sự cần thiết đối với phương thức Thiết lập (Construction) và Hủy (Destruction).Định nghĩa tính Bền vững (Persistence).Định nghĩa về tính đóng gói dữ liệu (Data Encapsulation)Hiểu biết về tính Thừa kế (Inheritance).Định nghĩa tính Đa hình (Polymorphism).Liệt kê những ưu điểm của phương pháp hướng Đối tượng.
Chương XỬ LÝ NGOẠI LỆ (Exception Handling) Sau kết thúc chương này, bạn nắm nội dung sau: Định nghĩa ngoại lệ (Exception) Hiểu mục đích việc xử lý ngoại lệ Hiểu kiểu ngoại lệ khác Java Mô tả mô hình xử lý ngoại lệ Hiểu khối lệnh chứa nhiều khối xử lý ngoại lệ (catch) Mô tả cách sử dụng khối ‘try’, ‘catch’ ‘finally’ Giải thích cách sử dụng từ khoá ‘throw’ ‘throws’ Tự tạo ngoại lệ 7.1 Giới thiệu Exception loại lỗi đặc biệt Lỗi xuất vào lúc thực thi chương trình Các trạng thái không bình thường xảy thi hành chương trình tạo exception Những trạng thái trước ta xây dựng chương trình Nếu bạn không xử lý trạng thái chương trình bị kết thúc đột ngột Ví dụ, việc chia cho tạo lỗi chương trình Ngôn ngữ Java cung cấp chế dùng để xử lý ngoại lệ hiệu Việc xử lý làm hạn chế tối đa trường hợp hệ thống bị hỏng (crash) hay hệ thống bị ngắt đột ngột Tính làm cho Java trở thành ngôn ngữ lập trình mạnh 7.2 Mục đích việc xử lý ngoại lệ Một chương trình nên có chế xử lý ngoại lệ thích hợp Nếu không, chương trình bị ngắt ngoại lệ xảy Trong trường hợp đó, tất nguồn tài nguyên mà hệ thống cấp không giải phóng Điều gây lãng phí tài nguyên Để tránh trường hợp này, tất nguồn tài nguyên mà hệ thống cấp nên thu hồi lại Tiến trình đòi hỏi chế xử lý ngoại lệ thích hợp Ví dụ, xét thao tác vào (I/O) tập tin Nếu việc chuyển đổi kiểu liệu không thực đúng, ngoại lệ xảy chương trình bị hủy mà không đóng tập tin lại Lúc tập tin dễ bị hư hại nguồn tài nguyên cấp phát cho tập tin không trả lại cho hệ thống 7.3 Xử lý ngoại lệ Khi ngoại lệ xảy ra, đối tượng (object) tương ứng với ngoại lệ tạo Đối tượng sau truyền cho phương thức nơi mà ngoại lệ xảy Đối tượng chứa thông tin chi tiết ngoại lệ Thông tin nhận xử lý Các môi trường runtime ‘IllegalAccessException’, ‘EmptyStackException’ v.v… tạo ngoại lệ Chương 7: Xử lý ngoại lệ (Exception Handling) 175 Chương trình tự tạo ngoại lệ Lớp ‘Throwable’ Java cung cấp lớp lớp Exception (lớp thừa kế), lớp lớp cha tất ngoại lệ khác 7.4 Mô hình xử lý ngoại lệ Trong Java, mô hình xử lý ngoại lệ giám sát việc thực thi mã để phát ngoại lệ Mô hình xử lý ngoại lệ Java gọi ‘catch and throw’ Trong mô hình này, ngoại lệ xảy ra, ngoại lệ bị chặn chương trình chuyển đến khối xử lý ngoại lệ Người lập trình phải xử lý ngoại lệ khác phát sinh chương trình Các ngoại lệ phải xử lý, thoát khỏi chương trình xảy Ngôn ngữ Java cung cấp từ khoá sau để xử lý ngoại lệ: try catch throw throws finally Dưới cấu trúc mô hình xử lý ngoại lệ: try { // đoạn mã có khả gây ngoại lệ } catch(Exception e1) { // Nếu lệnh khối ‘try’ tạo ngoại lệ có loại e1, thực //xử lý ngoại lệ không chuyển xuống khối 'catch' } catch(Exception e2) { // Nếu lệnh khối ‘try’ tạo ngoại lệ có loại e2, thực //xử lý ngoại lệ không chuyển xuống khối 'catch' } catch(Exception eN) { // Nếu lệnh khối ‘try’ tạo ngoại lệ có loại eN, thực //xử lý ngoại lệ không chuyển xuống khối 'catch' } finally { // khối lệnh thực cho dù ngoại lệ có xảy hay không } 176 Core Java 7.4.1 Các ưu điểm mô hình ‘catch throw’ Mô hình ‘catch throw’ có hai ưu điểm: Người lập trình phải xử lý ngoại lệ cần thiết Không cần phải thực mức Thông báo lỗi tiến hành xử lý ngoại lệ 7.4.2 Các khối ‘try’ ‘catch’ Khối ‘try-catch’ sử dụng để thi hành mô hình ‘catch throw’ việc xử lý ngoại lệ Khối ‘try’ chứa tập lệnh thi hành Các ngoại lệ bị chặn thi hành tập lệnh Phương thức có khả tạo ngoại lệ khai báo khối ‘try’ Một hay nhiều khối ‘catch’ theo sau khối ‘try’ Các khối ‘catch’ bắt ngoại lệ có khả tạo trong khối ‘try’ Hãy xem khối ‘try’ đây: try { doFileProcessing(); // phương thức người sử dụng định nghĩa displayResults(); } catch (Exeption e) // thể ngoại lệ { System.err.println(“Error :” + e.toString()); e.printStackTrace(); } Ở đây, ‘e’ đối tượng lớp ‘Exception’ Chúng ta sử dụng đối tượng để in chi tiết ngoại lệ Các phương thức ‘toString’ ‘printStackTrace’ sử dụng để mô tả ngoại lệ xảy Hình sau kết xuất phương thức ‘printStackTrace()’ Hình 7.1 Khối Try Catch Để xử lý ngoại lệ nào, ta phải kiểu ngoại lệ tương ứng catch(Exception e) Chương 7: Xử lý ngoại lệ (Exception Handling) 177 Khi ngoại lệ thuộc kiểu nào, sử dụng lớp ‘Exception’ để bắt ngoại lệ Khối ‘catch()’ bắt giữ lỗi xảy thi hành phương thức ‘doFileProcessing’ hay ‘display’ Nếu lỗi xảy thi hành phương thức ‘doFileProcessing()’, lúc phương thức ‘displayResults()’ không gọi Chương trình chuyển đến thực khối ‘catch’ Để có nhiều lớp xử lý lỗi hơn, ‘LookupException’ thay đối tượng ngoại lệ chung (Exception e), lỗi thực tế đối tượng thuộc lớp 'LookupException’ hay số lớp Lỗi truyền qua khối ‘try catch’ gặp ‘catch’ nó, không tìm thấy chương trình phải dừng thực thoát 7.5 Các khối chứa nhiều Catch Nhiều khối ‘catch’ xử lý loại ngoại lệ khác cách độc lập Chúng liệt kê đoạn mã sau: try { doFileProcessing(); displayResults(); } catch(LookupException e) { handleLookupException(e); // e – LookupException object // phương thức xử lý lỗi người sử dụng //định nghĩa } catch(Exception e) { System.err.println(“Error:” + e.printStackTrace()); } } Trong trường hợp này, khối ‘catch’ bắt giữ ‘LockupException’ Khối ‘catch’ thứ hai xử lý kiểu ngoại lệ khác với khối ‘catch’ thứ Một chương trình chứa khối ‘try’ lồng Ví dụ đoạn mã đây: try { statement 1; statement 2; try { statement1; statement2; } catch(Exception e) // khối try { 178 Core Java } } catch(Exception e) // khối try { } … Khi sử dụng ‘try’ lồng nhau, khối ‘try’ bên thi hành Bất kỳ ngoại lệ bị chặn khối ‘try’ bị bắt giữ khối ‘catch’ theo sau Nếu khối ‘catch’ thích hợp không tìm thấy khối ‘catch’ khối ‘try’ bên xem xét Nếu không, Java Runtime Environment xử lý ngoại lệ chương trình 7.1 minh họa cách sử dụng khối ‘try’ ‘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 chương trình: Hình 7.2 ArithmeticException Trong chương trình này, số chia cho Đây không phép toán số học hợp lệ Do ngoại lệ xảy bắt giữ khối catch Khi nhận biết loại ngoại lệ xảy ra, ta viết lệnh khối ‘catch’ Chương 7: Xử lý ngoại lệ (Exception Handling) 179 tương ứng Ở đây, ‘a’ sử dụng đối tượng ArithmeticException để in chi tiết ngoại lệ Nếu bạn thay lệnh ‘System.out.println’ khối ‘catch’ lệnh ‘System.out.println(a.getMessage())’ kết xuất chương trình sau: Hình 7.3 Câu thông báo lỗi Khi khối ‘try’ sử dụng mà khối ‘catch’ nào, chương trình biên dịch mà không gặp lỗi nào bị ngắt thực thi Bởi ngoại lệ xảy thực thi chương trình mà không xử lý 7.6 Khối ‘finally’ Khi ngoại lệ xuất hiện, phương thức thực thi bị dừng mà không hoàn thành Nếu điều xảy ra, đoạn mã phía sau (ví dụ đoạn mã có chức thu hồi tài nguyên, lệnh đóng tập viết cuối phương thức) không gọi Java cung cấp khối ‘finally’ để giải việc Khối ‘finally’ thực tất việc thu dọn ngoại lệ xảy Khối sử dụng kết hợp với khối ‘try’ Khối ‘finally’ chứa câu lệnh thu hồi tài nguyên cho hệ thống hay lệnh in câu thông báo Các lệnh bao gồm: Đóng tập tin Đóng ResultSet (được sử dụng chương trình sở liệu) Đóng lại kết nối tạo sở liệu try { doSomethingThatMightThrowAnException(); } finally { cleanup(); } Phương thức ‘cleanup()’ gọi phương thức ‘doSomethingThatMightThrowAnException()’ gây ngoại lệ Mặt khác ‘cleanup()’ gọi ngoại lệ xảy thực tiếp phần sau khối lệnh ‘finally’ 180 Core Java Khối ‘finally’ tuỳ ý, không bắt buộc Khối đặt sau khối ‘catch’ cuối Chương trình thực thi câu lệnh khối ‘finally’ sau gặp câu lệnh ‘return’ hay lệnh ‘break’ khối ‘try’ Khối ‘finally’ bảo đảm lúc thực thi, bất chấp có ngoại lệ xảy hay không Hình 7.4 Minh họa thực khối ‘try’, ‘catch’ ‘finally’ try block No Exception finally block Exception occurs catch block finally block Hình 7.4 Khối lệnh ‘try’, ‘catch’ ‘finally’ Chương trình 7.2 sử dụng khối ‘finally’ Ở đây, khối ‘finally’ thi hành bất chấp ‘ArithmeticException’ có xảy hay không Khối khai báo 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 Chương 7: Xử lý ngoại lệ (Exception Handling) 181 System.out.println(“Finally executed”); } } public static void main(String args[]) { new FinallyDemo(args); } } Kết xuất chương trình: Hình 7.5 Khối Finally Trong ví dụ này, câu lệnh khối ‘finally’ luôn thi hành, bất chấp ngoại lệ có xảy hay không Trong kết xuất trên, khối ‘finally’ thi hành ngoại lệ xảy 7.7 Các ngoại lệ định nghĩa với lệnh ‘throw’ ‘throws’ Các ngoại lệ tạo cách sử dụng từ khoá ‘throw’ Từ khóa ‘throw’ ngoại lệ vừa xảy Toán hạng throw đối tượng thuộc lớp thừa kế từ ‘Throwable’ Đoạn lệnh sau cách sử dụng lệnh ‘throw’: try { if (flag