Видове изключения

„Исках да говоря за още нещо днес. В Java всички изключения са разделени на два типа: проверени и непроверени (тези, които трябва да бъдат уловени и тези, които не трябва да хващате). По подразбиране всички изключения трябва да бъдат хванат."

„Можете ли умишлено да хвърляте изключения във вашия code?“

„Можете да хвърляте всяко изключение във вашия собствен code. Можете дори да пишете свои собствени изключения. Но ще говорим за това по-късно. Точно сега, нека се концентрираме върху изключенията, хвърлени от Java машината.“

"ДОБРЕ."

"Ако ClassNotFoundException or FileNotFoundException са хвърлени (възникват) в метод, разработчикът трябва да ги посочи в декларацията на метода. Това са проверени изключения. Ето How обикновено изглежда:"

Примери за проверени изключения
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

„Така че просто пишем „хвърляния“, последвани от списък с изключения, разделени със запетая, нали?“

"Да. Но има още. За да компorра програмата, методът, който извиква method1в примера по-долу, трябва да направи едно от двете неща: or да улови тези изключения, or да ги хвърли отново (на извикващия) , като посочи повторно хвърлените изключения в своята декларация. "

„Отново. Ако основният ви метод трябва да извика метод, чиято декларация съдържа „ хвърля FileNotFoundException , …“, тогава трябва да направите едно от двете неща:

1) Хванете FileNotFoundException , …

Трябва да обвиете codeа, извикващ небезопасния метод, в блок try-catch .

2) Не улавяйте FileNotFoundException , …

Трябва да добавите тези изключения към списъка с хвърляния на вашия основен метод."

— Бихте ли ми дали пример?

"Погледни това:"

Примери за проверени изключения
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");
}

„Кодът в този пример няма да се компorра, защото главният метод извиква method1() , който хвърля изключения, които трябва да бъдат уловени.“

„За да го компorраме, трябва да добавим обработка на изключения към основния метод. Можете да направите това по един от двата начина:“

Вариант 1: Просто хвърляме отново изключението (на повикващия):
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");
}

„И тук го хващаме с опит-хващане :“

Вариант 2: Хванете изключението:
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");
}

— Започва да става все по-ясно.

„Вижте следния пример. Ще ви помогне да разберете останалото.“

Вместо да обработваме изключения, ние ги хвърляме отново към методи по-надолу в стека на извикванията, които знаят How да се справят с тях:
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.");
    }
}
3
Задача
Java Syntax,  нивоурок
Заключено
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).

„Има още един вид изключение, RuntimeException и класове, които го наследяват. Не е нужно да ги улавяте. Това са непроверени изключения. Те се считат за трудни за предсказване. Можете да се справите с тях по същия начин, но вие не е необходимо да ги посочвате в клауза за хвърляния ."