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:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, exceptions underError
class, etc. - Checked Exceptions: They are checked at compile-time. For example,
IOException
,InterruptedException
, 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 throw
và throws
.
Java ném từ khóa
Chúng tôi sử dụng throws
từ 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.txt
không tồn tại, hãy FileInputStream
ném a FileNotFoundException
để mở rộng IOException
lớ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 throws
mệ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 throws
chính từ khóa.
Các findFile()
phương pháp xác định rằng một IOException
có 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 throws
từ 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
, IOException
và InvalidClassException
trong của nó throws
khoả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 throws
mệ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...catch
cho 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 throw
từ 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ừ try
khối này sang catch
khối khác. Chúng tôi sử dụng throw
từ 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 Throwable
hoặc lớp con của Throwable
lớ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 IOException
vớ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 throws
mệ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 throws
chí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ừ try
khối này sang catch
khố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 try
khối được bỏ qua và các câu lệnh trong catch
khối được thực thi.