web-dev-qa-db-ja.com

Java例外FileNotFoundとIOExceptionを同時にキャッチする

FileNotFoundExceptionはどういうわけかIOExceptionの「サブ例外」ですか?

これは、指定されたパスにあるファイルへの入力ストリームを開く私のコードです。

   method(){
        FileInputStream fs;
        try {
            fs = new FileInputStream(path);
            //
            fs.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

FileNotFoundを無視して、代わりにIOExceptionをキャッチできるのはなぜですか? FNFExceptionはIOExceptionの一部ですか?

例外をキャッチする代わりに、メソッドでIOExceptionをスローした場合はどうなりますか?

    method() throws IOException{

        FileInputStream fs;
        fs = new FileInputStream(path);
        //
        fs.close();

    }

このような呼び出しメソッドでFileNotFoundExceptionのキャッチに進むことはできますか?

    try {

         method();

    }catch (FileNotFoundException e1) {}

あなたが提供できるかもしれないどんな助けにも感謝します!

10
drx

FileNotFoundExceptionはどういうわけかIOExceptionの「サブ例外」ですか?

はい、 FileNotFoundExceptionextendsIOException

Java.lang.Object
    Java.lang.Throwable
        Java.lang.Exception
            Java.io.IOException
                Java.io.FileNotFoundException

FileNotFoundを無視して、代わりにIOExceptionをキャッチできるのはなぜですか?

スローされる例外の基本クラスをキャッチすると、より具体的なcatch句が使用可能でない限り、例外がキャッチされます。

このような呼び出しメソッドでFileNotFoundExceptionのキャッチに進むことはできますか?

絶対に!実際、これは良いことです。コードは、処理方法を知っている例外のみを処理し、他のすべての例外をより適切な方法で処理できる場所に伝播させる必要があります。

13
dasblinkenlight

はい、そうです。

継承を見ると、FileNotFoundExceptionIOExceptionのサブクラスです。スーパークラスをキャッチすることで、それを拡張するものもキャッチします。

別の方法で処理する必要がある場合は、最初の例のように、より具体的なものを最初にキャッチできます。

3
Tim B

Java 7以降、次のことができます。

catch(ExceptionType1 | ExceptionType2 e)複数の例外のキャッチを実行します。ただし、あなたの場合は、あなたが提案するように、IOExceptionをキャッチすることができます。

3
Martin Dinov

FileNotFoundExceptionはどういうわけかIOExceptionの「サブ例外」ですか?

そうです

例外をキャッチする代わりに、メソッドでIOExceptionをスローした場合はどうなりますか?

あなたはそうすることができます。メソッドが例外をスローすると、特にこの例外またはそれを継承する例外をスローできます。

このような呼び出しメソッドでFileNotFoundExceptionのキャッチに進むことはできますか?

はい。メソッドがAをスローすることを宣言している場合、BBを継承すれば、Aをキャッチできます(Bがスローされない場合でも) A明示的に)。

サイドノート:

  • リソースを正しく閉じていません。
  • Java 7を使用する場合は、代わりに新しいFilesAPIを使用してください。

最初のポイントは非常に重要です。 tryブロックで.close();ファイルを正常に開くことができても、ファイルからの読み取りに失敗した場合など、.close()notが呼び出されます。やったほうがいい:

FileInputStream in = ...;
try {
    // operate on "in"
} finally {
    in.close();
}

Java 7の場合:

try (
    FileInputStream in = ...;
) {
    // operate on "in"
}
// "in" is closed for you here
3
fge

はい、 javadoc が示すように、FileNotFoundExceptionIOExceptionのサブクラスです。

本当にFileNotFoundExceptionが必要な場合は、この実行のみをキャッチする必要があります。そうしないと、IOExceptionをキャッチすると、他の多くのFileNotFoundExceptionのように、それをサブクラス化する例外もキャッチされます。

2
Pierre Rust