Lỗi có thể xảy ra trong quá trình thực hiện chương trình. Đó là vấn đề chung của mọi lập trình viên, từ người mới bắt đầu đến dân chuyên nghiệp thực sự. Không phải tất cả các lỗi đều phát sinh do lỗi của nhà phát triển. Một số trong số chúng rất khó dự đoán và đôi khi là không thể. Ví dụ: trong khi tải xuống một chương trình, kết nối mạng có thể bị ngắt đột ngột hoặc mất điện. Những tình huống như vậy được gọi là ngoại lệ. Thử và nắm bắt là các phần của cấu trúc được sử dụng để xử lý các trường hợp ngoại lệ.
Khối thử và bắt Java
Khi xảy ra lỗi, Java thường dừng và tạo ra thông báo lỗi. Quá trình này được gọi là "Java ném một ngoại lệ". Java cung cấp các phương tiện đặc biệt để xử lý các ngoại lệ. Một trong số đó là thử...bắt...cuối cùng là xây dựng. Đây là cú pháp của khối try, khối bắt và khối cuối cùng.//try block
try {
// Block of code to try
}
//try catch
catch(Exception e) {
// Block of code to handle errors
}
finally {
// Optional block of code
}
Khi một ngoại lệ xảy ra trong khối try, điều khiển sẽ được chuyển đến khối bắt, khối này có thể xử lý ngoại lệ đó. Nếu không tìm thấy khối như vậy, một thông báo ngoại lệ chưa được xử lý sẽ được hiển thị cho người dùng và việc thực thi chương trình tiếp theo sẽ bị dừng. Để ngăn chặn việc dừng khẩn cấp như vậy, bạn cần sử dụng khối try..catch. ![Java Thử - Bắt - 1](https://cdn.codegym.cc/images/article/ab0bf0e8-2813-4ec0-827d-164b2284a9a8/800.jpeg)
Sơ lược về thử, bắt, cuối cùng, ném từ khóa
Xử lý ngoại lệ trong Java dựa trên việc sử dụng các từ khóa sau trong chương trình:- thử - xác định một khối mã trong đó có thể xảy ra ngoại lệ;
- bắt - xác định khối mã trong đó ngoại lệ được xử lý;
- cuối cùng - xác định một khối mã là tùy chọn, nhưng nếu có, vẫn được thực thi, bất kể kết quả của khối thử.
- ném - được sử dụng để đưa ra một ngoại lệ;
- ném - được sử dụng trong chữ ký phương thức để cảnh báo rằng một phương thức có thể đưa ra một ngoại lệ.
Ví dụ đơn giản về cấu trúc try-catch
Giả sử chúng ta có một chương trình với một số mảng.public class TryTest {
public static void main(String[] args) {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
}
}
Vì chúng ta đang cố gắng truy cập một phần tử mảng có chỉ mục không tồn tại nên chương trình sẽ thoát với lỗi:
Ngoại lệ trong luồng "chính" java.lang.ArrayIndexOutOfBoundsException: Chỉ mục 7 ngoài giới hạn cho độ dài 5
vào ngày.TryTest.main(TryTest.java:6)
Quá trình kết thúc với mã thoát 1
Hãy sửa đổi chương trình này và xử lý ngoại lệ này bằng cách thử bắt. Đầu tiên là khối thử, sau là khối bắt.
//try catch example
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
System.out.println("The exception was handled...");
}
System.out.println("This is the end of the program...");
}
}
Bây giờ đầu ra đã thay đổi:
Ngoại lệ đã được xử lý ...
Đây là phần cuối của chương trình...
Quá trình kết thúc với mã thoát 0
Quá trình kết thúc với mã thoát 0
Trong trường hợp này, chương trình đã hoàn thành chính xác, thông báo của chúng tôi sẽ hiển thị trên màn hình. Việc kết thúc đúng chương trình được báo hiệu bằng mã 0 ở cuối quá trình, trong khi không chính xác - 1. Khi sử dụng khối try...catch, tất cả các câu lệnh giữa câu lệnh try và Catch đều được thực thi trước tiên. Nếu một ngoại lệ xảy ra trong khối thử thì thứ tự thực thi thông thường sẽ dừng lại và chuyển sang câu lệnh bắt. Vì vậy, khi thực hiện chương trình đạt tới số[7]=8; dòng, chương trình sẽ dừng và đi đến khối bắt. Trong trường hợp của chúng tôi, chúng tôi đã khai báo biến myEx với kiểu Ngoại lệ. Đây là lớp cơ sở cho tất cả các ngoại lệ và vì vậy chúng có thể khác nhau. Ví dụ: có những trường hợp ngoại lệ chịu trách nhiệm về tình trạng tràn ngăn xếp, vượt ra ngoài việc lập chỉ mục mảng, như trong trường hợp của chúng tôi, trỏ tới Null, v.v. Nếu chúng ta không đoán được loại ngoại lệ thì chương trình cũng sẽ kết thúc không chính xác. Tuy nhiên, chúng tôi đã chọn loại Ngoại lệ để đơn giản hóa ví dụ và nó là lớp cơ sở cho tất cả các ngoại lệ. Vì vậy câu lệnh bắt (Exception myEx) sẽ xử lý hầu hết tất cả các ngoại lệ. Xử lý ngoại lệ trong trường hợp này Sau khi khối bắt hoàn tất, chương trình tiếp tục công việc của nó, thực hiện tất cả các lệnh khác sau khối bắt. Nếu bạn muốn xem các trường hợp ngoại lệ đã xảy ra, bạn có thể yêu cầu chương trình in một dấu vết ngăn xếp các lệnh gọi phương thức. Đây là những gì JVM thực hiện khi xảy ra một ngoại lệ chưa được phát hiện: nó dừng việc thực thi chương trình và in dấu vết ngăn xếp sau khi thực thi mã của khối cuối cùng, nếu có.
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
myEx.printStackTrace();
}
System.out.println("This is the end of the program...");
}
}
Việc xử lý ngoại lệ trong trường hợp này liên quan đến việc in ngăn xếp dấu vết lỗi ra bảng điều khiển bằng phương thức printStackTrace() được xác định trong lớp Ngoại lệ .
java.lang.ArrayIndexOutOfBoundsException: Chỉ mục 7 ngoài giới hạn cho độ dài 5
vào ngày.TryTest.main(TryTest.java:7)
Đây là phần cuối của chương trình...
Quá trình kết thúc với mã thoát 0
Tuy nhiên, chương trình đã thoát chính xác.
Cuối cùng! Sau khi bắt
Trong ví dụ và trong định nghĩa của các từ khóa để xử lý ngoại lệ, chúng tôi đã đề cập đến khối cuối cùng. Nó là tùy chọn, nhưng nếu có, nó sẽ được thực thi bất kể kết quả của khối thử. Hãy thay đổi loại ngoại lệ thành NullPointerException.public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (NullPointerException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
Đây là đầu ra:
Ngoại lệ trong luồng "chính" java.lang.ArrayIndexOutOfBoundsException: Chỉ mục 7 ngoài giới hạn cho độ dài 5
vào ngày.TryTest.main(TryTest.java:7)
Cuối cùng
Quá trình kết thúc với mã thoát 1
Nhân tiện, chúng ta có thể chỉ định loại ngoại lệ là chính xác. Đây là ngoại lệ IndexOutOfBounds.
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (IndexOutOfBoundsException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
Trong trường hợp này, đầu ra sẽ như sau:
Ngoại lệ đã được xử lý ...
Cuối cùng
Đây là phần cuối của chương trình...
Quá trình kết thúc với mã thoát 0
Cách thức hoạt động của các trường hợp ngoại lệ là gì?
Vấn đề là tất cả những từ này —bắt, ném, ném chỉ có thể được sử dụng với java.lang.Throwable hoặc các từ kế thừa của nó. Ví dụ: bạn có thể làm điều này:public class MyClass {
public static void main(String[] args) {
try {
} catch (Throwable thr) {
}
}
}
Tuy nhiên, bạn không thể làm điều đó như thế này:
public class MyClass {
public static void main(String[] args) {
try {
} catch (String thr) {
}
}
}