"Hôm nay tôi muốn nói về một điều nữa. Trong Java, tất cả các ngoại lệ được chia thành hai loại: được kiểm tra và không được kiểm tra (những loại phải bị bắt và những loại bạn không cần phải bắt). Theo mặc định, tất cả các ngoại lệ cần phải được bắt gặp."
"Bạn có thể cố ý ném ngoại lệ vào mã của mình không?"
"Bạn có thể đưa ra bất kỳ ngoại lệ nào trong mã của riêng mình. Bạn thậm chí có thể viết các ngoại lệ của riêng mình. Nhưng chúng ta sẽ nói về điều đó sau. Ngay bây giờ, hãy tập trung vào các ngoại lệ do Máy Java đưa ra."
"ĐƯỢC RỒI."
"Nếu ClassNotFoundException hoặc FileNotFoundException bị ném (xảy ra) trong một phương thức, nhà phát triển phải chỉ ra chúng trong khai báo phương thức. Đây là những ngoại lệ được kiểm tra . Đây là giao diện thường thấy:"
Ví dụ về các ngoại lệ được kiểm tra |
---|
|
|
|
"Vì vậy, chúng tôi chỉ viết 'ném' theo sau là một danh sách ngoại lệ được phân tách bằng dấu phẩy, phải không?"
"Có. Nhưng còn nhiều hơn nữa. Để chương trình biên dịch, phương thức gọi method1
trong ví dụ dưới đây phải thực hiện một trong hai việc: hoặc bắt các ngoại lệ này hoặc ném lại chúng (cho người gọi) , chỉ ra các ngoại lệ được ghi lại trong phần khai báo của nó. "
"Một lần nữa. Nếu phương thức chính của bạn cần gọi một phương thức có khai báo chứa ' throws FileNotFoundException , …', thì bạn cần thực hiện một trong hai điều sau:
1) Bắt FileNotFoundException ,…
Bạn phải bọc mã gọi phương thức không an toàn trong khối thử bắt .
2) Không bắt FileNotFoundException ,…
Bạn phải thêm các ngoại lệ này vào danh sách ném của phương thức chính của mình ."
"Ông có thể cho tôi một ví dụ?"
"Hãy xem này:"
public static void main(String[] args)
{
method1();
}
public static void method1() throws FileNotFoundException, ClassNotFoundException
{
//Throws FileNotFoundException if the file doesn't exist
FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}
"Mã trong ví dụ này sẽ không được biên dịch, bởi vì phương thức chính gọi method1() , phương thức này sẽ đưa ra các ngoại lệ phải được bắt."
"Để biên dịch nó, chúng ta cần thêm xử lý ngoại lệ vào phương thức chính. Bạn có thể thực hiện việc này theo một trong hai cách sau:"
public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException
{
method1();
}
public static void method1() throws FileNotFoundException, ClassNotFoundException
{
//Throws FileNotFoundException if the file doesn't exist
FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}
"Và ở đây chúng tôi bắt nó bằng một lần thử bắt :"
public static void main(String[] args)
{
try
{
method1();
}
catch(Exception e)
{
}
}
public static void method1() throws FileNotFoundException, ClassNotFoundException
{
//Throws FileNotFoundException if the file doesn't exist
FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}
"Nó bắt đầu trở nên rõ ràng hơn."
"Hãy xem ví dụ sau. Nó sẽ giúp bạn hiểu phần còn lại."
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
method1();
}
public static void method3() throws ClassNotFoundException
{
try
{
method1();
}
catch (FileNotFoundException e)
{
System.out.println("FileNotFoundException has been caught.");
}
}
public static void method4()
{
try
{
method1();
}
catch (FileNotFoundException e)
{
System.out.println("FileNotFoundException has been caught.");
}
catch (ClassNotFoundException e)
{
System.out.println("ClassNotFoundException has been caught.");
}
}
"Còn một loại ngoại lệ nữa, RuntimeException và các lớp kế thừa nó. Bạn không cần phải bắt chúng. Đây là những ngoại lệ không được kiểm soát. Chúng được coi là khó dự đoán. Bạn có thể xử lý chúng theo cách tương tự, nhưng bạn không cần chỉ ra chúng trong mệnh đề ném ."
GO TO FULL VERSION