loại ngoại lệ

"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 trakhô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
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

"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 method1trong 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:"

Ví dụ về các ngoại lệ được kiểm tra
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:"

Tùy chọn 1: Chúng tôi chỉ cần viết lại ngoại lệ (cho người gọi):
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 :"

Tùy chọn 2: Bắt ngoại lệ:
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."

Thay vì xử lý các ngoại lệ, chúng tôi sắp xếp lại chúng cho các phương thức xa hơn trong ngăn xếp cuộc gọi, những người biết cách xử lý chúng:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Xử lý một ngoại lệ và ném một ngoại lệ khác:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Bắt cả hai ngoại lệ, không ném:
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.");
    }
}
3
Nhiệm vụ
Java Syntax,  mức độbài học
Đã khóa
Code entry
Your attention, please! Now recruiting code entry personnel for CodeGym. So turn up your focus, let your fingers relax, read the code, and then... type it into the appropriate box. Code entry is far from a useless exercise, though it might seem so at first glance: it allows a beginner to get used to and remember syntax (modern IDEs seldom make this possible).

"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 ."