1. Trang chủ
  2. » Luận Văn - Báo Cáo

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 908 3

Đ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

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 243 KB

Nội dung

TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘIKHOA 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

Trang 1

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 :

Trang 2

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

Trang 3

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 racác Exception Những trạng thái này không được biết trước khi ta xây dựngchươ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ínhnă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àinà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ỗiruntime 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áchquan 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àylà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

Trang 4

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 đổikiể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 đượccấ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àysau đó được truyền cho phương thức là nơi mà lỗi xảy ra Đối tượng này chứathô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ôitrườ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ácngoạ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étcác trang thái ngoại lệ độc lập nhau từ việc điều khiển thông thương trongchươ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ươngthứ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

Trang 5

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ỉ rarằ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ứathô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à đưavà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ọngnhấ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ệ:

Trang 6

// Mã đựơc thực thi khi một ngoại lệ TypeException1 đựơc phát sinh 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ấymột kiểu ngại lệ nào được so khớp java sẽ kết thúc phương thức đó và chuyểnbiệt lệ đó ra phương thức đã gọi phương thức này quá trình này được tiếp tụccho đế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ệ trongchuỗ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áolỗ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ị

Trang 7

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:

Trang 8

khối “try” bên ngoài sẽ được xem xét Nếu không, Java Runtime Environment

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

Trang 9

‘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

ra Khối này có thể được sử dụng kết hợp với khối “try” Khối “finally” chứacá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ôngbá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

Trang 10

}

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 rahay không

Hình minh họa sự hình thành các khối ‘try’,’catch’ và ‘finally’

try block

catch block finally block

finally block

No Exception Exception occurs

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

Trang 11

Kết quả xuất của chương trình:

Thông báo dòng: Khong the chia cho so 0

Finally da duoc thuc hien

Trong ví dụ này, các câu lệnh trong khối ‘Finally’ luôn luôn thi hành bất chấplỗi có xảy ra hay không Trong kết quả xuất bên trên, khối ‘finally’ được thihành mặc dù có lỗi xảy ra

6 Các ngoại lệ được định nghĩa với lệnh ‘throw’ và ‘throws’

Trong exception còn 1 kiểu là ngoại lệ tự định nghĩa với throw và throws Các ngoại lệ bị chặn với sự trợ giúp của từ khóa throw Từ khóa throw chỉ ra 1

exception vừa xảy ra, Từ khóa‘throws’ để xử lý nhiều loại ngoại lệ.Một phươngthức đơn có thể chặn nhiều loại lỗi và để xử lý những lỗi này, ta cần cung cấpmột danh sách các lỗi mà phương thức chặn trong phần định nghĩa của phươngthức

Public class Example

Trang 14

Ở đây ngoại lệ ta tự định nghĩa là ngoại lệ NgoaiMienXacDinh ngoại lệ này

được kế thừa từ class NegativeArraySizeException Phuơng thức checkValue được gọi để chặn ngoại lệ và nó được đặt trong khối try-catch Ngoại lệ được kiểm trong điều kiện if của phuơng thức checkValue Nếu giá trị của phần tử ko phải là từ 0 -> 9 thì nó sẽ đối tượng của class NgoaiMienXacDinh được tạo ra.

7 Danh sách các ngoại lệ:

Bảng sau đây liệt kê một số ngoại lệ:

RuntimeException Lớp cơ sở cho nhiều lỗi java.lang

ArthmeticException Trạng thái lỗi về số, ví dụ như chia cho 0IllegalAccessException Lớp không thêt truy cập

IllegalArgumentException Phương thúc nhận một đối số không hợp

lệArrayIndexOutOfBoundsExeption Kích thước của mảng lớn hơn 0 hay lớn

hơn kích thước thật của mảngNullPointerException Khi muốn truy cập tới đối tượng nullSecurityException Việc thiết lập cơ chế bảo mật không được

hoạt độngClassNotFoundException Không thể truy nạp lớp yêu cầu

NumberFormatException Việc chuyển đổi không thành công từ

chuỗi sang số thực

IOException Lớp cha của các ngoại lệ I/O

FileNotFoundException Không thể định vị tập tin

NoSuchMethodException Phương thức yêu cầu không tồn tại

InterruptedException Khi một luồng bị ngắt

II Lớp File

1 Giới thiệu lớp file

Trang 15

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ụcxem 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.

Trang 16

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.

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"+"adirectory"));

System.out.println(f1.isFile()?"is normal file":"might be a namedpipe");

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");

}

}

Trang 17

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)

Trang 18

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ặctrù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:

public void deleteOnExit() Xóa file tương ứng với đối tượng gọi

hàm khi máy ảo Java kết thúcpublic boolean isHidden() Trả về true nếu file là ẩn Ngược lại là

false

public boolean setLastModified(long

milisec)

Đặt thời gian của tập tin theo milisec,

là số mili giây kể từ 0h00 ngày01/01/1970 theo mốc định vị toàncầu(UTC)

public boolean setReadOnly(long

milisec)

Đặt thuộc tính tập tin là read-only

public String getPath() Lấy đường dẫn của tập tin

public String[] list() 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

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

w