Xử lý ngoại lệ trong java (Bài 4)

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.

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 2

Xu ly ngoai le trong java 3

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:

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) {
       System.out.println("Phep chia cho 0: " + ae);
    } catch (ArrayIndexOutOfBoundsException aie) {
       System.out.println("Vuot ngoai chi so mang: " + aie);
    }
 }
}

Ví dụ 2:

public class SampleException2 {
 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ụ 3: Khối try…catch lồng nhau

public class SampleException3 {
 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ụ:

import java.io.FileWriter;
import java.io.IOException;

/**
 *
 * @author giasutinhoc.vn
 */
public class SampleException4 {

 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ụ:

public class SampleException5 {
 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 SampleException6 {
    
    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);
       }
    }

Bài tập thực hành xử lý ngoại lệ trong java

Tạo package tên exception và thực hiện các yêu cầu bên dưới

Bài thực hành số 1: 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 (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).

  • 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.

Xem giáo trình môn lập trình java

Nội dung bình luận cho “Xử lý ngoại lệ trong java (Bài 4)

Trả lời