BÁO CÁO BÀI TẬP LỚN Môn Lập Trình Java Tìm hiểu về cơ chế bắt lỗi (Exception Handling) trong Java

29 904 3
BÁO CÁO BÀI TẬP LỚN Môn Lập Trình Java Tìm hiểu về cơ chế bắt lỗi (Exception Handling) trong Java

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO BÀI TẬP LỚN Môn Lập Trình Java Đề tài 7: “ - Tìm hiểu về cơ chế bắt lỗi (Exception Handling) trong Java - Tìm hiểu về lớp File và interface Serializable - Viết chương trình đọc và ghi tệp chứa các đối tượng Sinh viên có các thông tin về mã sinh viên, họ tên và ngày sinh.” Giáo viên hướng dẫn: Ngô Công Thắng Nhóm sinh viên thực hiện : 1 Nguyễn Thị Hồng Anh 2 Nguyễn Thị Thu Hải 3 Hoàng Thị Hoa 4 Hoàng Thị Nga 5 Nguyễn Thị Thu Quỳnh -1- Nội dung chính : I, Cơ chế bắt lỗi (Exception Handling) 1, Giới thiệu một lỗi (exception) 2, Mục đích của việc xử lý lỗi 3, Mô tả mô hình xử lý lỗi 4, Các khối ‘try’ và ‘catch’ 5, Khối ‘finally’ 6, Các ngoại lệ được định nghĩa với lệnh ‘throw’ và ‘throws’ 7, Danh sách các ngoại lệ II, Lớp File : 1, Giới thiệu lớp File 2, Một số phương thức trong lớp File 3, Thư mục 4, FilenameFiter 5, ListFiles() III, Lớp interface Serializable : IV, Chương trình : Tên chương trình : “Viết chương trình đọc và ghi tệp chứa các đối tượng Sinh viên có các thông tin về mã sinh viên, họ tên và ngày sinh” -2- I Cơ chế bắt lỗi (Exception Handling) 1 Giới thiệu Exception là một nỗi đặc biệt Lỗi này xuất hiện vào lúc thực thi trương trình Các trạng thái không bình thường xảy ra trong khi thi hành trương trình tạo ra các Exception Những trạng thái này không được biết trước khi ta xây dựng chương trình Nếu bạn không phân phối các trạng thái này thì exception có thể bị kết thúc đột ngột Ví dụ, việc chia cho 0 sẽ tao một lỗi trong trương trình Ngôn ngữ Java cung cấp bộ máy xử lý lỗi rất tốt Việc xử lý này làm hạn chế tối đa trường hợp hệ thống bị phá vỡ (crash) hay hệ thống bị ngắt đột ngột Tính năng này làm cho Java là một ngôn ngữ lập trình mạnh Các lỗi trong một chương trình: - Lỗi cú pháp: Đối với lỗi cú pháp người lập trình có thể phát hiện và sửa lỗi, dựa vào trình biên dịch, đây là lỗi dễ phát hiện và sửa chữa, tuy nhiên đây cũng là lỗi gây khó khăn và chán nản đối với người mới học lập trình - Lỗi thuật toán: Đây là lỗi khó phát hiện và sửa chữa nhất, tuy nhiên trong bài này ta không bàn luận về vấn đề này - Lỗi thực thi : Ta hoàn toàn có thể kiểm soát được chúng, thông thường lỗi runtime thường do nguyên nhân khách quan như: truy cập vào một ổ đĩa nhưng ổ đĩa này lại chưa sẵn sàng, hay thực hiện phép chia nhưng mẫu số lại bằng 0, kết nối với máy tính ở xa nhưng máy đó lại không tồn tại… Là một lỗi khách quan chúng ta có thể kiểm soát được nhờ cơ chế bắt lỗi trong java 2 Mục đích của việc xử lý lỗi Một chương trình nên có cơ chế xử lý lỗi thích hợp Nếu không, chương trình sẽ ngắt khi hệ thống xảy ra lỗi Trong trường hơp đó, tất cả các nguồn tài nguyên mà hệ thống trước kia phân phối sẽ được di dời trong cùng trạng thái Điều này làm gây lãng phí nguồn tài nguyên Để tránh trường hợp này, tất cả các nguồn -3- tài nguyên mà hệ thống phân phối nên được thu hồi lại Tiến trình này đòi hỏi cơ chế xử lý lỗi thích hợp Cho ví dụ, xét thao tác nhập xuất (I/O) trong một tập tin Nếu việc chuyển đổi kiểu dữ liệu không thực hiện đúng, một lỗi sẽ xảy ra và chương trình bị hủy mà không đóng lai tập tin Lúc đó tập tin dễ bị hư hại và các nguồn tài nguyên được cấp phát cho tập tin không được thu hồi lại cho hệ thống 3 Mô hình xử lý lỗi Khi một lỗi xảy ra, đối tượng tương ứng với lỗi đó được tạo ra Đối tượng này sau đó được truyền cho phương thức là nơi mà lỗi xảy ra Đối tượng này chứa thông tin chi tiết về lỗi Thông tin này có thể được nhận về và xử lý Các môi trường runtime như ‘IllegalAccessException’, ‘EmptyStackException’ v.v có thể chặn được các lỗi, đoạn mà trong chương trình đôi khi có thể xảy ra các ngoại lệ Trong Java, mô hình xử lý ngoại lệ kiểm tra việc xử lý những hiệu ứng lỗi, được biết đến là mô hình ‘catch và throw’ Trong mô hình này, Khi một lỗi xảy ra, một ngoại lệ sẽ bị chặn và được đưa vào trong một khối Người lập trình nên xét các trang thái ngoại lệ độc lập nhau từ việc điều khiển thông thương trong chương trình Các ngoại lệ phải được bắt giữ nêu không chương trình sẽ bị ngắt Mô hình xử lý lỗi dựa trên 3 hoạt động chính : - Đặc tả ngoại lệ: Đặc tả ngoại lệ là khai báo cho trình biên dịch biết là phương thức này có thể gây ra ngoại lệ lúc thi hành Để khai báo biệt lệ ta sử dụng từ khoá throws trong khai báo phương thức, ví dụ: public void myMethod() throws IOException, RemoteException Từ khoá ‘throws’ chỉ cho trình biên dịch java biết rằng phương thức này có thể ném ra ngoại lệ IOException và RemoteException, nếu một phương thức ném ra nhiều ngoại lệ thì các ngoại lệ được khai báo cách nhau bởi dấu phẩy ‘,’ - Loại bỏ một ngoại lệ ra: Một phương thức sau khi đã khai báo các biệt lệ, thì bạn (hoặc chương trình thực thi java) có thể ném ra các đối tượng biệt lệ, có kiểu mà ta đã khai báo trong danh sách throws -4- Cú pháp của lệnh ném ra ngoại lệ: throw ExceptionObject; - Bắt lỗi: Một ngoại lệ (exception) trong chương trình Java là dấu hiệu chỉ ra rằng có sự xuất hiện một điều kiện không bình thường nào đó Khi một ngoại lệ xảy ra, đối tượng tương ứng với ngoại lệ đó được tạo ra Đối tượng này sau đó được truyền cho phương thức là nơi mà ngoại lệ xảy ra Đối tượng này chứa thông tin chi tiết về ngoại lệ Thông tin này có thể được nhận về và được xử lý Các ngoại lệ này có thể là một ngoại lệ chuẩn của Java hoặc có thể là một ngoại lệ do ta tạo ra Trong mô hình này mỗi khi lỗi xảy ra sẽ được phát hiện và đưa vào một khối để xử lý Mọi lớp biệt lệ trong java đều được dẫn xuất từ lớp cơ sở throwable, ta có thể tạo ra lớp ngoại lệ riêng bằng cách mở rộng lớp throwable: - try: dùng để chứa đoạn mã gây ra lỗi - catch: dùng để chứa đoạn mã xử lý lỗi - throw: chỉ ra lỗi vừa xảy ra - throws: liệt kê các lỗi xảy ra - finally: khối lệnh luôn thực hiện dù lỗi có xảy ra trong khối try hay không Sau khi bạn đã biết cách khai báo và ném ra biệt lệ, thì phần việc quan trọng nhất là bắt và xử lý biệt lệ Vấn đề đối với người lập trình java là phải biết được đoạn mã nào của anh ta có thể gây ra lỗi Khi họ đã khoanh vùng được đoạn mã có thể gây ra lỗi họ sẽ đặt đoạn mã, có khả năng gây ra lỗi đó trong khối ‘try’ ( thử làm), và đặt đoạn mã xử lý lỗi trong khối ‘catch’ ( bắt giữ) Dạng tổng quát như sau: Dưới đây là cấu trúc của mô hình xử lý ngoại lệ: try { // Các lệnh có khả năng gây lỗi } catch ( TypeException1 ex) { -5- // Mã đựơc thực thi khi một ngoại lệ TypeException1 đựơc phát sinh trong khối try } catch ( TypeException2 ex) { // Mã đựơc thực thi khi một ngoại lệ TypeException2 đựơc phát sinh trong khối try } catch ( TypeExceptionN ex) { // Mã đựơc thực thi khi một ngoại lệ TypeExceptionN đựơc phát sinh trong khối try } finally { // khối lệnh nay luôn được thực hiện cho dù ngoại lệ có xảy ra trong khối try hay không } Nếu không có một ngoại lệ nào phát sinh trong khối try thì các mệnh đề catch sẽ bị bỏ qua, trong trường hợp một trong các câu lệnh bên trong khối try gây ra một ngoại lệ thì, thì java sẽ bỏ qua các câu lệnh còn lại trong khối try để đi tìm mã xử lý ngoại lệ, nếu kiểu ngoại lệ so khớp với kiểu ngoại lệ trong mệnh đề catch, thì mã lệnh trong khối catch đó sẽ được thực thi, nếu không tìm thấy một kiểu ngại lệ nào được so khớp java sẽ kết thúc phương thức đó và chuyển biệt lệ đó ra phương thức đã gọi phương thức này quá trình này được tiếp tục cho đến khi tìm thấy mã xử lý biệt lệ, nếu không tìm thấy mã xử lý biệt lệ trong chuỗi các phương thức gọi nhau, chương trình có thể chấm dứt và in thông báo lỗi ra luồng lỗi chuẩn System.err 4 Các khối ‘try’ và ‘catch’ Khối try - catch được sử dụng để thi hành mô hình catch và throw của việc xử lý lỗi Khối try chứa một bộ các lệnh có thể thi hành được Các lỗi có thể bị -6- chặn khi thi hành những câu lệnh này Phương thức dùng để chặn lỗi có thể được khai báo trong khối try Một hay nhiều khối catch có thể theo sau khối try Các khối catch này bắt các lỗi trong khối try Để bắt giữ bất cứ một lỗi nào, ta phải chỉ ra kiểu lỗi là Exception catch(Exception e) Khi lỗi bị bắt giữ không biết thuộc kiểu nào, chúng ta có thể sử dụng lớp Exception để bắt lỗi đó Các khối chứa nhiều catch Các khối chứa nhiều catch xử lý các kiểu lỗi khac nhau một cách độc lập Một chương trình cũng có thể chứa các khối ‘try’ lồng nhau Ví dụ đoạn mã dưới đây: try { statement 1; statement 2; try { statement 1; statement 2; } } catch(Exception e) { } … Khi sử dụng các “try” lồng nhau, khối “try”bên trong được thi hành đầu tiên Bất kỳ lỗi nào bị chặn trong khối “try” sẽ bị bắt giữ trong khối “catch” theo sau Nếu khối catch thích hợp không được tìm thấy thì các khối “catch” của các -7- khối “try” bên ngoài sẽ được xem xét Nếu không, Java Runtime Environment xử lý các lỗi Chương trình 1 minh họa cách sử dụng các khối “try” và “catch” Chương trình 1: class TryClass { public static void main(String args[]) { int b=0; try { System.out.println(20/b); } catch(ArithmeticException a) { System.out.println(“Khong the thuc hien phep chia cho 0”); } } } Kết quả chương trình hiện ra dòng thông báo: Khong the thuc hien phep chia cho 0 Trong chương trình này, một số được chia cho 0 Đây không là toán tử số học hợp lệ Do đó một lỗi bị chặn và bị bắt giữ trong khối catch Khi người lập trình viên nhận biết được loại ngoại lệ nào có thể xảy ra, anh ta viết một câu lệnh trong khối catch Ở đây “a” được sử dụng như một đối tượng của Arithmaticexception để in các chi tiết về các toán tử lỗi mà hệ thống cung cấp Nếu bạn thay thế lệnh ‘System.out.println’ của khối catch bằng lệnh -8- ‘System.out.println(a.getMessage())’ thì kết quả xuất của chương trình như sau: / by zero Khi các khối try được sử dụng mà không có các khối catch nào, chương trình sẽ biên dịch mà không gặp sự cố nào nhưng sẽ bị ngắt khi thực thi Bởi vì lỗi đã xảy ra khi thực thi chuong trình Mô hình ‘catch và throw’ có hai ưu điểm: - Người lập trình viên phải phân phối trạng thái lỗi chỉ vào những nơi cần thiết, không cần phải thực hiện tại mọi mức - Một thông báo lỗi có thể được in ra khi tiến hành xử lý lỗi 5 Khối “finally” Khi một lỗi xuất hiện, phương thức đang được thực thi có thể bị dừng mà không được thi hành toàn vẹn Nếu điều này xảy ra, thì các đoạn mã (ví dụ như đơạn mã với chức năng thu hồi tài nguyên có các lệnh đóng lại tập tin khai báo cuối phương thức) sẽ không bao giờ được gọi Java cung cấp khối “finally” để giải quyết việc này Khối “finally” thực hiện tất cả các việc thu dọn khi một lỗi xảy ra Khối này có thể được sử dụng kết hợp với khối “try” Khối “finally” chứa các câu lệnh thu hồi tài nguyên về cho hệ thống hay lệnh in ra các câu thông báo Các lệnh này bao gồm: - Đóng tập tin - Đóng lại bộ kết quả (được sử dụng trong chương trình cơ sở dữ liệu) - Đóng lại các kết nối được tạo trong cơ sở dữ liệu try { doSomethingThatMightThrowAnException(); } finally { -9- cleanup(); } Phương thức “cleanup()” được gọi nếu phương thức”doSomethingThatMightThrowAnException()” chặn một lỗi Mặt khác cleanup() cũng được gọi ngay khi không có lỗi nào bị chặn và thi hành tiếp tục sau khối lệnh finally Khi finally là tùy ý, không bắt buộc Khối này được đặt sau khối catch Hệ thống sẽ duyệt từ câu lệnh đầu tiên của khối finally sau khi gặp câu lệnh return hay lệnh break được dung trong khối try Khối ‘finally’ bảo đảm lúc nào cũng được thực thi, bất chấp có lỗi nào xảy ra hay không Hình minh họa sự hình thành các khối ‘try’,’catch’ và ‘finally’ try block No Exception finally block Exception occurs catch block finally block Chương trình Tryclass sử dụng khối finally Ở đây khối finally được thi hành bất chấp ArithmeticException có xảy ra hay không Khối này khai báo các hoạt động thu dọn Chương trình: class FinallyDemo { public static void main(String[] args) { String name; int a=5,b=0; try { System.out.println("Ket qua :" + a/b); } - 10 - Mặc dù hầu hết các lớp của java.io hoạt động trên các stream, nhưng ngược lại ở lớp File Nó giao tiếp trực tiếp các file và hệ thống file Lớp File không xác định thông tin mang về hoặc được lưu trữ trên các tập tin như thế nào Một đối tượng File dùng giám sát và thao tác thông tin tương ứng với một tập tin trên đĩa như thời gian, ngày tháng, đường dẫn thư mục và cây thư mục con Lớp File không phục vụ cho việc nhập/xuất dữ liệu trên luồng Lớp File thông thường dùng để biết được các thông tin chi tiết về tệp tin cũng như thư mục (tên, ngày giờ tạo, kích thước,….) Các tập tin là nguồn và đích của dữ liệu bên trong nhiều chương trình Mặc dù có nhiều hạn chế trong việc sử dụng chúng Vì các lý do an toàn, tập tin vẫn là tài nguyên trọng yếu cho việc lưu trữ liên tục và chia sẻ thông tin Một thư mục xem như một tập tin trong Java với thuộc tính thư mục 2 Một số phương thức trong lớp File Lớp File có các hàm khởi tạo sau: File(String directoryPath) File(String directoryPath, String filename) File(File dirObj, String filename) Trong đó, directoryPath là tên đường dẫn của tập tin, filename là tên tập tin, và dirObj là một đối tượng File xác định thư mục Ví dụ sau tạo ra ba tập tin: f1, f2, f3 Đối tượng File đầu tiên được xây dựng với một đường dẫn thư mục Đối tượng thứ hai với đường dẫn và tên file Đối tượng thứ ba bao gồm đường dẫn của tập tin chỉ đến f1 và một tên tập tin; f3 chỉ đến cùng một tập tin như f2 File f1 = new File("/"); File f2 = new File("/","autoexec.bat"); File f3 = new File(f1,"autoexec.bat"); File định nghĩa nhiều phương thức lấy các thuộc tính chuẩn của đối tượng File Ví dụ, getName() trả về tên của file, getParent() trả về tên của thư mục cha và exists() trả về true nếu file tồn tại Tuy vậy, lớp File không có tính đối xứng - 15 - Tức là có nhiều phương thức cho phép bạn tham chiếu các thuộc tính của một đối tượng file đơn giản, nhưng không có phương thức tương ứng để thay đổi các thuộc tính đó Ví dụ sau minh họa một số phương thức của File Ví dụ: import java.io.File; import fita.ncthang.console.cin; class tuan { public static void main(String args[]) { File f1 = new File("/Program Files/java/jre6/COPYRIGHT"); System.out.println("File Name: "+ f1.getName()); System.out.println("Path: "+f1.getPath()); System.out.println("Abs Path: "+ f1.getAbsolutePath()); System.out.println("Parent: "+f1.getParent()); System.out.println(f1.exists() ?"exists" : "does not exist"); System.out.println(f1.canWrite()? "is writeable":"is not writeable"); System.out.println(f1.canRead() ? "is readable":"is not readable"); System.out.println("is "+ (f1.isDirectory()?"" : "not"+"a directory")); System.out.println(f1.isFile()?"is normal file":"might be a named pipe"); System.out.println(f1.isAbsolute()?"is absolute":"is not absolute"); System.out.println("File last modified: "+f1.lastModified()); System.out.println("File size: "+ f1.length()+"Bytes"); } } - 16 - Kết quả: isFile() trả về true nếu đối tượng là tập tin thật sự, trả về false nếu là thư mục, isFile() trả về false với các tập tin đặc biệt như là các tập tin điều khiển thiết bị (driver) Hàm isAbsolute() trả về true nếu file có một đường dẫn tuyệt đối và false nếu đường dẫn của nó là tương đối File cũng có hai phương thức tiện ích +Thứ nhất là renameTo(): boolean renameTo(File newName) - 17 - Trong đó, tên tập tin là newName trở thành tên mới của đối tượng File Nó trả về true nếu đổi tên thành công, ngược lại trả về false (trường hợp bạn cố gắng đổi tên một tập tin đến mức nó di chuyển từ thư mục này sang thư mục khác hoặc trùng tên với một tập tin khác đang tồn tại ) +.Thứ hai là delete(): Xóa tập tin trên đĩa: boolean delete() Bạn có thể sử dụng delete() xóa một thư mục nếu nó rỗng delete() trả về true nếu xóa thành công, ngược lại trả về false Một số phương thức quan trọng : Phương thức public void deleteOnExit() Mô tả Xóa file tương ứng với đối tượng gọi public boolean isHidden() hàm khi máy ảo Java kết thúc Trả về true nếu file là ẩn Ngược lại là false public boolean setLastModified(long Đặt thời gian của tập tin theo milisec, milisec) là số mili giây kể từ 0h00 ngày 01/01/1970 theo mốc định vị toàn public boolean cầu(UTC) setReadOnly(long Đặt thuộc tính tập tin là read-only milisec) public String getPath() public String[] list() Lấy đường dẫn của tập tin Lấy danh sách tên các tập tin và thư mục con của đối tượng File đang xét và trả về trong một mảng 3.Thư mục: Thư mục là lớp File chứa danh sách các tập tin và thư mục khác Hai hàm tiện ích khác của File là mkdir() và mkdirs() Hàm mkdir() tạo ra một thư mục, trả về true nếu thành công Trường hợp xảy ra lỗi khi đường dẫn xác định trong đối - 18 - tượng File đang tồn tại, hoặc là đường dẫn không gồm tên thư mục cần tạo của File chưa tồn tại.Để tạo ra một thư mục không cần có đường dẫn đã tồn tại ta dùng hàm mkdirs(), nó tạo ra một thư mục và tất cả các thư mục cha của thư mục đó có mặt trong đường dẫn của File Khi bạn tạo đối tượng File và đặt nó là thư mục, hàm isDirectory() trả về true Trong trường hợp đó, bạn có thể gọi list() để trích danh sách các file và thư mục khác bên trong Hàm này có hai dạng, thứ nhất là: String[] list()//Danh sách các tập tin trả về trong mảng các String Chương trình sau khi chỉ ra cách dùng list() như thế nào để có nội dung của thư mục import java.io.File; import fita.ncthang.console.cin; class DirList { public static void main(String args[]) { String dirname = "C:/Program Files/Java/jdk1.6.0_16"; File f1 = new File(dirname); if (f1.isDirectory()) { System.out.println("Directory of "+ dirname); String s[] = f1.list(); for (int i=0;i

Ngày đăng: 14/04/2015, 09:01

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan