11 thg 4, 2010

Exception trong java - Ngoại lệ trong java

1.1 Khái niệm và mục đích sử dụng
Exception là một đối tượng được tạo ra khi chương trình gặp lỗi được java trả về nhằm mục đích dò tìm và sửa lỗi chương trình
1.2 Các kiểu exception
Có ba kiểu exception trong java là checked exception, error và unchecked exception (runtime exception)
Checked exception là loại ngoại lệ phổ biến sử dụng để kiểm tra những lỗi phổ biến trong lúc biên dịch ví dụ bạn truy xuất một tập tin không tồn tại trên ổ đĩa thì bạn sẽ nhận được một java.io.FileNotFoundException. Checked exception kế thừa từ java.lang.Exception và chúng được dùng trong try-catch-finally.
Error là một loại lỗi nằm ngoài phạm vi ứng dụng, được java trả về trong đối tượng java.io.IOError. Ví dụ ứng dụng mở một tập tin thành công nhưng khi đọc dữ liệu lại không đọc được do ổ cứng bị hỏng một vài sector vật lý, …
Unchecked exception thường được hiểu là những exception được sinh ra do lỗi logic khi lập trình và được trả về lúc runtime. Unchecked exception kế thừa từ java.lang.RuntimeException
1.3 Bắt giữ và xử lý các exception
Để xử lý một exception ta dùng lệnh try-catch-finally, throw hoặc throws
Try chứa các dòng lệnh thực hiện một chức năng nào đó mà có thể gây ra exception
Catch chứa các dòng lệnh để xử lý kết quả khi nhận được một exception từ java sau khi khối try tạo ra exception.
Finally các dòng lệnh trong khối này luôn luôn được thưc thi khi thoát khối try
Ví dụ:
int a = 0;
int b = 1;
int c;

try {
c = b/a;
}
catch (ArithmeticException e)
{
System.out.println("Arithmetic Exception");
}
finally {
System.out.println("Finally");
}
Với đoạn code trên ta sẽ có kết quả in ra màn hình là:
Arithmetic Exception
Finally
throws
Ví dụ:
public static int getEndMember(int[] a) throws ArrayIndexOutOfBoundsException {
return a[a.length];
}
public static void main(String[] args) {
int[] a = {1, 2, 3};
try {
getEndMember(a);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException");
}
}
Đoạn code trên sẽ in ra ArrayIndexOutOfBoundsException bởi vì hàm getEndMember đã truy xuất phần tử a[3] không có trong mảng.
throw
Chúng ta cũng có thể dùng throw để quăng ra một exception Object
Ví dụ:
public static int getEndMember(int[] a) throws ArrayIndexOutOfBoundsException {
return a[a.length-1];
}
public static void main(String[] args) {
int[] a = {1, 2, 0};
int j;

try {
int i = getEndMember(a);
if (i == 0) {
throw new ArithmeticException();
}
else{
j = 10/i;
}
}
catch(ArithmeticException e) {
System.out.println("ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsExceptionkkkk");
}
}
Đoạn code trên sẽ in ra ArithmeticException bởi vì giá trị nhận được i = 0

1.4 Exception tự định nghĩa
Chúng ta có thể tự định nghĩa ra những lớp ngoại lệ riêng nếu chúng ta thấy java cung cấp chưa đủ thông tin ngoại lệ như chúng ta mong muốn.
Ví dụ về cách sử dụng exception tự định nghĩa:
class MyException extends Exception {
MyException() {

}
}

public class ExceptionDemo {
public static void executeHasException() throws MyException {
throw new MyException();
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
executeHasException();
} catch (MyException e) {
e.printStackTrace();
}
}
}
Và kết quả in ra màn hình sẽ là
exception_2.MyException
at exception_2.ExceptionDemo.executeHasException(ExceptionDemo.java:18)
at exception_2.ExceptionDemo.main(ExceptionDemo.java:27)

1.5 Một số exception đơn giản
a. NullPointerException (java.lang)
Xảy ra khi chúng ta tham khảo đến một đối tượng rỗng
Ví dụ:
• Gọi phương thức instance của một đối tượng rỗng
• Truy cập thuộc tính của một đối tượng rỗng
• …
int[] a = null;
int b;

try {
b = a[10];
}
catch (NullPointerException e)
{
System.out.println("NullPointerException"); //In ra NullPointerException
}
Đoạn code trên sinh ra một exception NullPointerException bởi vì đối tượng a là rỗng mà chúng ta vẫn truy cập thuộc tính của nó.

b. NumberFormatException (java.lang)
Một exception cũng khá thường gặp là khi biến đổi string sang số
Ví dụ:
String s = "Luvina";

try {
int i = Integer.parseInt(s);
}
catch (NumberFormatException e)
{
System.out.println("NumberFormatException"); //In ra NumberFormatException
}
Đoạn code trên sẽ xảy ra exception vì chuỗi s không thể biến đổi thành số nguyên i được

c. ArayIndexOutOfBoundsException (java.lang)
Truy xuất phần tử ngoài phạm vi của mảng
int[] a = {1, 2, 3};
int b;

try {
b = a[10];
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("ArrayIndexOutOfBoundsException");
}

d. ArithmeticException (java.lang)
Lỗi do các biểu thức toán học, thường là do chia cho 0
Ví dụ:
int a = 0;
int b = 1;
int c;

try {
c = b/a;
}
catch (ArithmeticException e)
{
System.out.println("Arithmetic Exception");
}

1 nhận xét: