Xử lý ngoại lệ trong Java

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các phương pháp xử lý ngoại lệ khác nhau trong Java với sự trợ giúp của các ví dụ.

Trong hướng dẫn trước, chúng ta đã tìm hiểu về các ngoại lệ của Java . Chúng tôi biết rằng các trường hợp ngoại lệ chấm dứt việc thực thi một chương trình một cách bất thường.

Đây là lý do tại sao điều quan trọng là phải xử lý các trường hợp ngoại lệ. Dưới đây là danh sách các cách tiếp cận khác nhau để xử lý các ngoại lệ trong Java.

  • try…catch block
  • finally block
  • throw and throws keyword

1. Java try … bắt khối

Khối try-catch được sử dụng để xử lý các ngoại lệ trong Java. Đây là cú pháp của try...catchkhối:

try {
  // code
}
catch(Exception e) {
  // code
}

Ở đây, chúng tôi đã đặt mã có thể tạo ra một ngoại lệ bên trong trykhối. Mỗi trykhối được theo sau bởi một catchkhối.

Khi một ngoại lệ xảy ra, nó sẽ bị chặn bởi catchkhối. Các catchkhối không thể được sử dụng mà không có trykhối.

Ví dụ: Xử lý ngoại lệ bằng try … catch

class Main {
  public static void main(String[] args) {

    try {

      // code that generate exception
      int divideByZero = 5 / 0;
      System.out.println("Rest of code in try block");
    }
    
    catch (ArithmeticException e) {
      System.out.println("ArithmeticException => " + e.getMessage());
    }
  }
}

Đầu ra

ArithmeticException => / by zero

Trong ví dụ, chúng tôi đang cố gắng chia một số cho 0. Ở đây, mã này tạo ra một ngoại lệ.

Để xử lý ngoại lệ, chúng tôi đã đặt mã, 5 / 0bên trong trykhối. Bây giờ khi một ngoại lệ xảy ra, phần còn lại của mã bên trong trykhối sẽ bị bỏ qua.

Các catchkhối bắt ngoại lệ và báo cáo bên trong khối catch được thực thi.

Nếu không có câu lệnh nào trong trykhối tạo ra ngoại lệ, catchkhối đó sẽ bị bỏ qua.

2. Cuối cùng thì khối Java

Trong Java, finallykhối luôn được thực thi bất kể có ngoại lệ hay không.

Các finallykhối là không bắt buộc. Và, đối với mỗi trykhối, chỉ có thể có một finallykhối.

Cú pháp cơ bản của finallykhối là:

try {
  //code
}
catch (ExceptionType1 e1) { 
  // catch block
}
finally {
  // finally block always executes
}

Nếu một ngoại lệ xảy ra, finallykhối sẽ được thực thi sau try...catchkhối. Nếu không, nó được thực thi sau khối try. Đối với mỗi trykhối, chỉ có thể có một finallykhối.

Ví dụ: Xử lý ngoại lệ trong Java sử dụng khối cuối cùng

class Main {
  public static void main(String[] args) {
    try {
      // code that generates exception
      int divideByZero = 5 / 0;
    }

    catch (ArithmeticException e) {
      System.out.println("ArithmeticException => " + e.getMessage());
    }
    
    finally {
      System.out.println("This is the finally block");
    }
  }
}

Đầu ra

ArithmeticException => / by zero
This is the finally block

Trong ví dụ trên, chúng ta đang chia một số cho 0 bên trong trykhối. Ở đây, mã này tạo ra một ArithmeticException.

Ngoại lệ được chặn bởi catchkhối. Và, sau đó finallykhối được thực thi.

Lưu ý : Đó là một thực hành tốt để sử dụng finallykhối. Đó là vì nó có thể bao gồm các mã dọn dẹp quan trọng như,

  • code that might be accidentally skipped by return, continue or break
  • closing a file or connection

3. Từ khóa ném và ném trong Java

throwTừ khóa Java được sử dụng để đưa ra một ngoại lệ rõ ràng.

Khi chúng ta throwmột ngoại lệ, luồng chương trình sẽ di chuyển từ trykhối này sang catchkhối khác.

Ví dụ: Xử lý ngoại lệ bằng Java ném

class Main {
  public static void divideByZero() {

    // throw an exception
    throw new ArithmeticException("Trying to divide by 0");
  }

  public static void main(String[] args) {
    divideByZero();
  }
}

Đầu ra

Exception in thread "main" java.lang.ArithmeticException: Trying to divide by 0
        at Main.divideByZero(Main.java:5)
        at Main.main(Main.java:9)

Trong ví dụ trên, chúng ta đang ArithmeticExceptionsử dụng throwtừ khóa một cách rõ ràng .

Tương tự, throwstừ khóa được sử dụng để khai báo loại ngoại lệ có thể xảy ra trong phương thức. Nó được sử dụng trong khai báo phương thức.

Ví dụ: Từ khóa ném Java

import java.io.*;

class Main {
  // declareing the type of exception
  public static void findFile() throws IOException {

    // code that may generate IOException
    File newFile = new File("test.txt");
    FileInputStream stream = new FileInputStream(newFile);
  }

  public static void main(String[] args) {
    try {
      findFile();
    }
    catch (IOException e) {
      System.out.println(e);
    }
  }
}

Đầu ra

java.io.FileNotFoundException: test.txt (The system cannot find the file specified)

Khi chúng tôi chạy chương trình này, nếu tệp test.txt không tồn tại, hãy FileInputStreamném a FileNotFoundExceptionmở rộng IOExceptionlớp.

Các findFile()phương pháp xác định rằng một IOExceptioncó thể được ném. Các main()phương pháp gọi phương pháp này và xử lý các ngoại lệ nếu nó được ném.

Nếu một phương thức không xử lý các ngoại lệ, thì loại ngoại lệ có thể xảy ra trong nó phải được chỉ rõ trong throwsmệnh đề.

Để tìm hiểu thêm, hãy truy cập Java ném và ném .









Gõ tìm kiếm nhanh...