Xử lý ngoại lệ trong java (Bài 4) – Gia Sư Tin Học

Xử lý ngoại lệ trong java có thể sử dụng khối
try-catch, có thể sử dụng final trong khối try…catch hoặc sử dụng từ
khoá throws. Sử dụng cách nào để xử lý ngoại lệ trong java còn tuỳ thuộc
vào từng tình huống.

Xử lý ngoại lệ trong java – Tổng quan về ngoại lệ

Ngoại lệ gì (Exception)

Có những lỗi chỉ khi chạy chúng mới xuất
hiện và chương trình đang chạy lập tức ngừng lại và xuất hiện thông báo
lỗi – đó chính là ngoại lệ (exception).

Ví dụ: Chương trình chia 2 số. Nếu ta cho mẫu số =0 thì phát sinh lỗi và đó được coi là 1 ngoại lệ.

Xu ly ngoai le trong java 1

Cơ bản về ngoại lệ

Có nhiều ngoại lệ là lớp con của lớp Exception

  • RuntimeErrorException là lớp con của lớp Exception
  • RuntimeErrorException là các ngoại lệ chỉ xảy khi chạy chương trình.

Người lập trình có thể tự tạo các class kế thừa từ class Exception.

Ngoại lệ ‘unchecked’: Là các ngoại lệ không cần phải ‘catch’ khi viết mã

Ngoại lệ ‘checked’: Là các ngoại lệ phải được ‘catch’ khi viết mã

Xu ly ngoai le trong java 2Xu ly ngoai le trong java 3

Xử lý ngoại lệ trong java – Sử dụng khối try… catch để xử ngoại lệ

try {
    //Khối lệnh có thể phát sinh ngoại lệ
} catch (Tên_Ngoại_lệ Tên_Đối_Tượng) {
   //Khối lệnh xử lý khi có ngoại lệ
}

Ví dụ không sử dụng try…catch

c = a/b; 
System.out.println("Sau phep chia !");(*)

Câu lệnh (*) sẽ không được thực hiện nếu mẫu số b=0, chương trình lập tức ngừng lại và xuất hiện thông báo lỗi của hệ thống

Ví dụ sử dụng khối try… catch để xử lý ngoại lệ

try {
 c = a/b;
} catch(Exception e) {
    System.out.println("Có lỗi "+e);
}
System.out.println("Sau phép chia !"); (*)

Câu lệnh (*) sẽ luôn được thực hiện dù mẫu số b bằng 0 hay b khác 0.

Dùng try nhiều catch

Trong một đoạn code có thể có nhiều ngoại lệ xảy ra nên ta sẽ dùng nhiều catch để xử lý các ngoại lệ đó.

Các lệnh catch thường được viết theo thứ tự xuất hiện của ngoại lệ.

Chú ý: Tất cả các ngoại lệ sẽ là lớp con của class Exception nên catch cuối cùng sẽ là Exception.

Ví dụ 1: Ngoại lệ xảy ra khi chia cho số 0 và sai chỉ số mảng

public class SampleException1 {
 public static void main (String args[]) {
    try {
      int b = 0;
      int a = 5 / b;
      int arr[] = {1, 2};
      arr[3] = 10;
      System.out.println("a = " + a);
    } catch (ArithmeticException ae) {               // (1)
       System.out.println("Phep chia cho 0: " + ae);
    } catch (Exception e) {                          // (2)
       System.out.println("Co loi: " + e);
    }
 }
}

Nếu xuất hiện ngoại lệ phép chia cho 0
thì lệnh (1) sẽ xử lý, còn các ngoại lệ khác sẽ được xử lý bởi lệnh (2).
Nếu đặt (2) đổi chỗ cho (1) thì (2) sẽ xử lý luôn ngoại lệ chia cho 0
vì như thế không cần (1) nữa. Vì thế không thể thay đổi vị trí giữa lệnh
(1) và lệnh (2).

Ví dụ 2: Khối try…catch lồng nhau

public class SampleException2 {
 public static void main (String args[]) {
    try {
      int a = 2; // cho a = 0 hoặc a = 1 để test
      int b = 42 / a;
      System.out.println("Ket qua cua phep chia la " + b);
      try {
        if(a == 1) {
          a = a / (a - a);
        }
        if(a == 2) {
          int c[] = {10};
          c[5] = 17;
        }
      } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Vuot qua chi so mang");
      }
    } catch (ArithmeticException ae) {
       System.out.println("Phep chia cho 0");
    }
 }
}

Lưu ý sử dụng khối try… catch để xử lý ngoại lệ

Trong khối finally sẽ chứa một khối mã
sẽ thực hiện sau khối try/catch. Khối finally sẽ được thực hiện dù ngoại
lệ có xuất hiện hay không. Tuy nhiên, mỗi try sẽ yêu cầu có ít nhất 1
catch hoặc 1 finally.

Xu ly ngoai le trong java 4

Ví dụ: Xử lý ngoại lệ có finally

import java.io.FileWriter;
import java.io.IOException;
/**
 *
 * @author giasutinhoc.vn
 */
public class SampleException3 {
 public static void main(String args[]) {
    FileWriter fw = null;
    try {
       fw = new FileWriter("data.txt");
       fw.write("Xu ly ngoai le trong java");
    } catch (IOException ie) {
       System.out.println("Loi ghi file: " + ie);
    } finally {
      try {
       if (fw != null) {
        fw.close();
       }
    } catch (IOException ioe) {
      System.out.println("Loi dong: " + ioe);
    }
   }
 }
}

Xử lý ngoại lệ trong java – Sử dụng từ khóa throws

Từ khóa throws được sử dụng trong phương
thức dùng để đề xuất các ngoại lệ có thể xảy ra trong phương thức đó.
Có những phương thức sử dụng một số lệnh mà các lệnh đó có thể xảy ra
ngoại lệ ‘checked’ nên chúng ta bắt buộc phải xử lý ngoại lệ đó.

Ví dụ khi xử lý các lệnh thao tác với
file, phải xử lý ngoại lệ ‘checked’ FileNotFoundException. Tất cả các
ngoại lệ được khai báo bởi throws đều phải được xử lý, nếu không có đủ
sẽ bị thông báo lỗi.

Ví dụ: Xử lý ngoại lệ khi ghi file

public class SampleException4 {

 public void writeFile() throws IOException {
    FileWriter fw = new FileWriter("data.txt");
    fw.write("Xu ly ngoai le trong java");
    fw.close();
 }

 public static void main(String args[]) {
    try {
      SampleException5 se5 = new SampleException5();
      se5.writeFile();
    } catch (IOException ioe) {
      System.out.println("Co loi ghi file: "+ ioe);
    }
 }
}

Xử lý ngoại lệ trong java – Tự tạo exception 

Chúng ta có thể tự viết class xử lý ngoại lệ của riêng mình bằng cách kế thừa class Exception của Java

Cú pháp:

public class Tên_Exception extends Exception {
    @override
    public String toString() {
       Viết xử lý
    }
 }

Ví dụ: Tạo MyException.java

public class MyException extends Exception {
    private int ex;

    public MyException(int num) {
       ex = num;
    }

    @override
    public String toString() {
       return "My exception " + ex;
    }
 }

Ví dụ: Sử dụng MyException

public class SampleException5 {
    static void tinhToan(int a) throws MyException {
       if(a > 10) {
          throw new MyException(a);
       }
    }

    public static void main(String args[]) {
       try {
          tinhToan(2);   //Không tạo ra ngoại lệ
          tinhToan(20);  //Tạo ra ngoại lệ
       } catch (MyException me) {
          System.out.println("Loi: " + me);
       }
    }
}

Xử lý ngoại lệ trong java – Thực hành

Tạo package tên exception và tạo class tên SinhVien có các thuộc tính như mã sinh viên, họ tên, điểm, xếp loại

Tiêu chí xếp loại dựa vào điểm

  • Nếu điểm >= 8 thì xếp loại giỏi
  • Điểm > = 7 thì xếp loại khá
  • Điểm >= 5 thì xếp loại trung bình
  • Điểm < 5 thì xếp loại kém

Một số yêu cầu khác

  • Viết các setter, getter, constructor, toString.
  • Nhập dữ liệu cho sinh viên từ bàn phím.
    Viết code xử lý nhập dữ liệu hợp lệ. Nếu nhập sai kiểu dữ liệu thì
    thông báo lỗi và yêu cầu nhập lại. Ví dụ nhập điểm là 10a thì chương trình sẽ hiển thị thông báo “Bạn phải nhập dữ liệu là kiểu số”
  • In thông tin sinh viên ra màn hình.