例外の種類

「今日はもう 1 つ話したいことがありました。Java では、すべての例外はチェック済みとチェックなし(キャッチする必要があるものとキャッチする必要のないもの) の 2 つのタイプに分けられます。デフォルトでは、すべての例外は次のとおりです。つかまった。"

「コード内で意図的に例外をスローできますか?」

「独自のコードで任意の例外をスローできます。独自の例外を作成することもできます。ただし、それについては後で説明します。ここでは、Java マシンによってスローされる例外に集中しましょう。」

"OK。"

「メソッドでClassNotFoundExceptionまたはFileNotFoundExceptionがスロー (発生) した場合、開発者はメソッド宣言でそれらを指定する必要があります。これらはチェック例外です。通常は次のようになります。」

チェックされる例外の例
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

「つまり、「スロー」の後にカンマ区切りの例外リストを記述するだけですよね?

「はい。しかし、それだけではありません。プログラムをコンパイルするには、以下の例で呼び出すメソッドはmethod12 つのことのいずれかを実行する必要があります。これらの例外をキャッチするか、宣言で再スローされた例外を示して (呼び出し元に) 再スローするかのいずれかです。 」

「繰り返します。メイン メソッドが、宣言に「 throws FileNotFoundException , …」が含まれるメソッドを呼び出す必要がある場合は、次の 2 つのうちの 1 つを行う必要があります。

1) FileNotFoundExceptionをキャッチします ...

安全でないメソッドを呼び出すコードを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");
}

「メインメソッドがメソッド 1()を呼び出し、キャッチする必要がある例外をスローするため、この例のコードはコンパイルされません。」

「コンパイルするには、メイン メソッドに例外処理を追加する必要があります。これは、次の 2 つの方法のいずれかで実行できます。」

オプション 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");
}

「それはより明確になり始めています。」

「次の例を見てください。残りの部分を理解するのに役立ちます。」

例外を処理する代わりに、例外を処理方法を知っているコール スタックのさらに下位のメソッドに再スローします。
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
1 つの例外を処理し、別の例外をスローします。
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,  レベル 9レッスン 4
ロック未解除
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).

「もう 1 種類の例外、 RuntimeExceptionとそれを継承するクラスがあります。 これらをキャッチする必要はありません。これらはチェックされていない例外です。予測するのは難しいと考えられています。同じ方法で処理できますが、throws節でそれらを指定する必要はありません。」