例外の種類

「今日はもう 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.");
    }
}

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