Trong hướng dẫn này, chúng ta sẽ tìm hiểu về câu lệnh try catch trong Java với sự trợ giúp của các ví dụ.
Các try...catch
khối trong Java được sử dụng để xử lý trường hợp ngoại lệ và ngăn ngừa việc chấm dứt bất thường của chương trình.
Đây là cú pháp của một try...catch
khối trong Java.
try{
// code
}
catch(exception) {
// code
}
Các try
khối bao gồm mã mà có thể tạo ra một ngoại lệ.
Các catch
khối bao gồm mã được thực hiện khi có xảy ra một ngoại lệ bên trong try
khối.
Ví dụ: Java try … catch khối
class Main {
public static void main(String[] args) {
try {
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ụ trên, hãy lưu ý dòng,
int divideByZero = 5 / 0;
Ở đây, chúng tôi đang cố gắng chia một số cho số không . Trong trường hợp này, một ngoại lệ xảy ra. Do đó, chúng tôi đã bao gồm mã này bên trong try
khối.
Khi chương trình gặp mã này, ArithmeticException
xảy ra. Và, ngoại lệ được catch
khối bắt và thực thi mã bên trong catch
khối.
Các catch
khối được chỉ thực hiện nếu có tồn tại một ngoại lệ bên trong try
khối.
Lưu ý : Trong Java, chúng ta có thể sử dụng một try
khối mà không cần một catch
khối. Tuy nhiên, chúng ta không thể sử dụng một catch
khối mà không có try
khối.
Java thử … cuối cùng đã chặn
Chúng ta cũng có thể sử dụng try
khối cùng với một khối cuối cùng.
Trong trường hợp này, khối cuối cùng luôn được thực thi cho dù có ngoại lệ bên trong khối thử hay không.
Ví dụ: Java try … last block
class Main {
public static void main(String[] args) {
try {
int divideByZero = 5 / 0;
}
finally {
System.out.println("Finally block is always executed");
}
}
}
Đầu ra
Finally block is always executed Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:4)
Trong ví dụ trên, chúng ta đã sử dụng try
khối cùng với finally
khối. Chúng ta có thể thấy rằng mã bên trong try
khối đang gây ra một ngoại lệ.
Tuy nhiên, mã bên trong finally
khối được thực thi bất kể ngoại lệ.
Java thử … bắt … cuối cùng chặn
Trong Java, chúng ta cũng có thể sử dụng khối cuối cùng sau try...catch
khối. Ví dụ,
import java.io.*;
class ListOfNumbers {
// create an integer array
private int[] list = {5, 6, 8, 9, 2};
// method to write data from array to a fila
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering try statement");
// creating a new file OutputFile.txt
out = new PrintWriter(new FileWriter("OutputFile.txt"));
// writing values from list array to Output.txt
for (int i = 0; i < 7; i++) {
out.println("Value at: " + i + " = " + list[i]);
}
}
catch (Exception e) {
System.out.println("Exception => " + e.getMessage());
}
finally {
// checking if PrintWriter has been opened
if (out != null) {
System.out.println("Closing PrintWriter");
// close PrintWriter
out.close();
}
else {
System.out.println("PrintWriter not open");
}
}
}
}
class Main {
public static void main(String[] args) {
ListOfNumbers list = new ListOfNumbers();
list.writeList();
}
}
Đầu ra
Entering try statement Exception => Index 5 out of bounds for length 5 Closing PrintWriter
Trong ví dụ trên, chúng ta đã tạo một danh sách có tên mảng và một tệp có tên là output.txt . Ở đây, chúng tôi đang cố gắng đọc dữ liệu từ mảng và lưu trữ vào tệp.
Lưu ý mã,
for (int i = 0; i < 7; i++) {
out.println("Value at: " + i + " = " + list[i]);
}
Ở đây, kích thước của mảng là 5
và phần tử cuối cùng của mảng là tại list[4]
. Tuy nhiên, chúng tôi đang cố gắng truy cập các phần tử tại a[5]
và a[6]
.
Do đó, mã tạo ra một ngoại lệ bị khối bắt.
Vì finally
khối luôn được thực thi, chúng tôi đã bao gồm mã để đóng PrintWriter
bên trong khối cuối cùng.
Một thực tiễn tốt là sử dụng khối cuối cùng để bao gồm mã dọn dẹp quan trọng như đóng tệp hoặc kết nối.
Lưu ý : Có một số trường hợp khi một finally
khối không thực thi:
- Use of
System.exit()
method - An exception occurs in the
finally
block - The death of a thread
Nhiều khối bắt
Đối với mỗi try
khối, có thể có 0 hoặc nhiều catch
khối. Nhiều catch
khối cho phép chúng tôi xử lý từng ngoại lệ khác nhau.
Loại đối số của mỗi catch
khối cho biết loại ngoại lệ có thể được xử lý bởi nó. Ví dụ,
class ListOfNumbers {
public int[] arr = new int[10];
public void writeList() {
try {
arr[10] = 11;
}
catch (NumberFormatException e1) {
System.out.println("NumberFormatException => " + e1.getMessage());
}
catch (IndexOutOfBoundsException e2) {
System.out.println("IndexOutOfBoundsException => " + e2.getMessage());
}
}
}
class Main {
public static void main(String[] args) {
ListOfNumbers list = new ListOfNumbers();
list.writeList();
}
}
Đầu ra
IndexOutOfBoundsException => Index 10 out of bounds for length 10
Trong ví dụ này, chúng tôi đã tạo một mảng số nguyên có tên là arr
kích thước 10 .
Vì chỉ số mảng bắt đầu từ 0 nên phần tử cuối cùng của mảng là tại arr[9]
. Lưu ý tuyên bố,
arr[10] = 11;
Ở đây, chúng tôi đang cố gắng gán một giá trị cho chỉ mục 10 . Do đó, IndexOutOfBoundException
xảy ra.
Khi một ngoại lệ xảy ra trong try
khối,
- The exception is thrown to the first
catch
block. The firstcatch
block does not handle anIndexOutOfBoundsException
, so it is passed to the nextcatch
block. - The second
catch
block in the above example is the appropriate exception handler because it handles anIndexOutOfBoundsException
. Hence, it is executed.
Bắt nhiều ngoại lệ
Từ Java SE 7 trở lên, giờ đây chúng ta có thể bắt gặp nhiều loại ngoại lệ với một catch
khối.
Điều này làm giảm sự trùng lặp mã và tăng tính đơn giản và hiệu quả của mã.
Mỗi loại ngoại lệ có thể được xử lý bởi catch
khối được phân tách bằng thanh dọc |
.
Cú pháp của nó là:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
Để tìm hiểu thêm, hãy truy cập Java để bắt nhiều ngoại lệ .
Câu lệnh try-with-resources trong Java
Câu lệnh try-with-resources là một câu lệnh try có một hoặc nhiều khai báo tài nguyên.
Cú pháp của nó là:
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
Tài nguyên là một đối tượng được đóng ở cuối chương trình. Nó phải được khai báo và khởi tạo trong câu lệnh try.
Hãy lấy một ví dụ.
try (PrintWriter out = new PrintWriter(new FileWriter("OutputFile.txt")) {
// use of the resource
}
Câu lệnh try-with-resources còn được gọi là quản lý tài nguyên tự động . Câu lệnh này tự động đóng tất cả các tài nguyên ở cuối câu lệnh.
Để tìm hiểu thêm, hãy truy cập câu lệnh java try-with-resources .