Java ném

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng từ khóa ném và ném để xử lý ngoại lệ với sự trợ giúp của các ví dụ.

Trong Java, các ngoại lệ có thể được phân loại thành hai loại:

  • Unchecked Exceptions: They are not checked at compile-time but at run-time.For example: ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException, exceptions under Error class, etc.
  • Checked Exceptions: They are checked at compile-time. For example, IOExceptionInterruptedException, etc.

Tham khảo Các ngoại lệ của Java để tìm hiểu chi tiết về các ngoại lệ đã chọn và không được chọn.

Thông thường, chúng ta không cần phải xử lý các trường hợp ngoại lệ không được chọn. Đó là bởi vì các ngoại lệ không được kiểm tra xảy ra do lỗi lập trình. Và, đó là một thực hành tốt để sửa chúng thay vì xử lý chúng.

Hướng dẫn này bây giờ sẽ tập trung vào cách xử lý các ngoại lệ đã kiểm tra bằng cách sử dụng throwvà throws.

Java ném từ khóa

Chúng tôi sử dụng throwstừ khóa trong khai báo phương thức để khai báo loại ngoại lệ có thể xảy ra bên trong nó.

Cú pháp của nó là:

accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 … {
  // code
}

Như bạn có thể thấy từ cú pháp trên, chúng ta có thể sử dụng throwsđể khai báo nhiều ngoại lệ.

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

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    // code that may produce 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 (No such file or directory)

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

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 bên trong nó phải được chỉ định trong throwsmệnh đề để các phương thức trong ngăn xếp cuộc gọi có thể xử lý chúng hoặc chỉ định chúng bằng cách sử dụng throwschính từ khóa.

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ém nhiều ngoại lệ

Đây là cách chúng ta có thể đưa ra nhiều ngoại lệ bằng cách sử dụng throwstừ khóa.

import java.io.*;
class Main {
  public static void findFile() throws NullPointerException, IOException, InvalidClassException {
    
    // code that may produce NullPointerException
    … … … 

    // code that may produce IOException
    … … … 

    // code that may produce InvalidClassException 
    … … … 
  }

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

Tại đây, các findFile()phương pháp xác định rằng nó có thể ném NullPointerExceptionIOExceptionvà InvalidClassExceptiontrong của nó throwskhoản.

Lưu ý rằng chúng tôi đã không xử lý NullPointerException. Điều này là do nó là một ngoại lệ không được kiểm tra. Không nhất thiết phải ghi rõ nó trong throwsmệnh đề và xử lý nó.

ném từ khóa Vs. cố gắng … bắt … cuối cùng

Có thể có một số phương pháp có thể gây ra ngoại lệ. Viết try...catchcho mỗi phương pháp sẽ tẻ nhạt và mã trở nên dài và khó đọc hơn.

throws cũng hữu ích khi bạn đã kiểm tra ngoại lệ (một ngoại lệ phải được xử lý) mà bạn không muốn mắc phải trong phương thức hiện tại của mình.

Từ khóa ném Java

Các throwtừ khóa được sử dụng để ném một cách rõ ràng một ngoại lệ duy nhất.

Khi một ngoại lệ được ném ra, luồng thực thi chương trình sẽ chuyển từ trykhối này sang catchkhối khác. Chúng tôi sử dụng throwtừ khóa trong một phương pháp.

Cú pháp của nó là:

throw throwableObject;

Một đối tượng có thể ném là một thể hiện của lớp Throwablehoặc lớp con của Throwablelớp.

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

class Main {
  public static void divideByZero() {
    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:3)
    at Main.main(Main.java:7)
exit status 1

Trong ví dụ này, chúng tôi đang ném một cách rõ ràng ArithmeticException.

Lưu ý: ArithmeticException là một ngoại lệ không được kiểm tra. Thường không cần thiết phải xử lý các trường hợp ngoại lệ không được chọn.

Ví dụ 3: Ném ngoại lệ đã kiểm tra

import java.io.*;
class Main {
  public static void findFile() throws IOException {
    throw new IOException("File not found");
  }

  public static void main(String[] args) {
    try {
      findFile();
      System.out.println("Rest of code in try block");
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}

Đầu ra

File not found

Các findFile()phương pháp ném một IOExceptionvới thông điệp chúng ta được truyền cho constructor của nó.

Lưu ý rằng vì nó là một ngoại lệ được kiểm tra, chúng ta phải chỉ định nó trong throwsmệnh đề.

Các phương thức gọi findFile()phương thức này cần phải xử lý ngoại lệ này hoặc chỉ định nó bằng cách sử dụng throwschính từ khóa.

Chúng tôi đã xử lý ngoại lệ này trong main()phương thức. Luồng thực thi chương trình chuyển từ trykhối này sang catchkhối khác khi một ngoại lệ được ném ra. Vì vậy, phần còn lại của mã trong trykhối được bỏ qua và các câu lệnh trong catchkhối được thực thi.









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