Java ném và ném từ khóa

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:

  • Trường hợp ngoại lệ được kiểm soát: Họ không kiểm tra tại thời gian biên dịch nhưng chạy time.For dụ: ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, trường hợp ngoại lệ dưới Errorlớp vv
  • Các ngoại lệ được kiểm tra : Chúng được kiểm tra tại thời điểm biên dịch. Ví dụ, IOException, InterruptedExceptionvv

Tham khảo Các ngoại lệ của Java để tìm hiểu chi tiết về các ngoại lệ được 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 throwthrows.

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 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 (Không có tệp hoặc thư mục như vậy) 

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 FileNotFoundExceptionmở 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 tôi 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 NullPointerException, IOExceptionInvalidClassExceptiontrong 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. thử… 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ẽ rất tẻ nhạt và mã trở nên dài và khó đọc.

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

 Ngoại lệ trong luồng "main" java.lang.ArithmeticException: Đang cố gắng chia cho 0 tại Main.divideByZero (Main.java:3) tại trạng thái thoát Main.main (Main.java:7) 1 

Trong ví dụ này, chúng tôi rõ ràng đang ném một 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

 Không tìm thấy tệp 

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 throwschính từ khóa.

Chúng tôi đã xử lý ngoại lệ này trong main()phương pháp. 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.

thú vị bài viết...