「今日はもう 1 つ話したいことがありました。Java では、すべての例外はチェック済みとチェックなし(キャッチする必要があるものとキャッチする必要のないもの) の 2 つのタイプに分けられます。デフォルトでは、すべての例外は次のとおりです。つかまった。"
「コード内で意図的に例外をスローできますか?」
「独自のコードで任意の例外をスローできます。独自の例外を作成することもできます。ただし、それについては後で説明します。ここでは、Java マシンによってスローされる例外に集中しましょう。」
"OK。"
「メソッドでClassNotFoundExceptionまたはFileNotFoundExceptionがスロー (発生) した場合、開発者はメソッド宣言でそれらを指定する必要があります。これらはチェック例外です。通常は次のようになります。」
チェックされる例外の例 |
---|
|
|
|
「つまり、「スロー」の後にカンマ区切りの例外リストを記述するだけですよね?
「はい。しかし、それだけではありません。プログラムをコンパイルするには、以下の例で呼び出すメソッドはmethod1
2 つのことのいずれかを実行する必要があります。これらの例外をキャッチするか、宣言で再スローされた例外を示して (呼び出し元に) 再スローするかのいずれかです。 」
「繰り返します。メイン メソッドが、宣言に「 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 つの方法のいずれかで実行できます。」
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");
}
「そして、ここではトライキャッチでキャッチします:」
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();
}
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節でそれらを指定する必要はありません。」
GO TO FULL VERSION