Перехват исключений 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) {}

Спасибо за любую помощь вы могли бы предоставить!

5 ответов


является ли FileNotFoundException каким-то" суб-исключением " IOException?

да FileNotFoundException выходит IOException:

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

как я могу пренебречь FileNotFound и просто поймать IOException вместо этого?

улавливание базового класса создаваемого исключения будет улавливать исключение, если нет более конкретного catch пункт доступен.

могу ли я перейти к перехвату FileNotFoundException при вызове метода, подобного этому?

абсолютно! На самом деле, это хорошая вещь: ваш код должен обрабатывать только исключения, с которыми он знает, как обращаться, и позволять всем другим исключениям распространяться в место, где с ним можно было бы справиться лучше.


Да, это так.

Если вы посмотрите на наследование FileNotFoundException суб-класс IOException. Поймав супер класс, вы также поймаете все, что его расширяет.

вы можете сначала поймать более конкретный, как в первом примере, Если вам нужно обработать его по-другому.


начиная с Java 7 Вы можете сделать:

catch(ExceptionType1 | ExceptionType2 e) для выполнения уловов с несколькими исключениями. Однако в вашем случае вы можете просто поймать IOException, как вы предлагаете.


является ли FileNotFoundException каким-то" суб-исключением " исключения IOException?

да.

вместо того, чтобы ловить исключения, что делать, если я бросаю IOException в моем методе?

вы можете сделать это. Когда метод вызывает excpetion, он может вызвать это исключение в частности или любое исключение, наследующее его.

могу ли я продолжить, чтобы поймать FileNotFoundException при таком методе вызова?

да. Если метод объявляет throw A, вы можете поймать B Если B наследует A (даже если B не брошен A явно).

Примечание:

  • вы неправильно закрываете свои ресурсы;
  • если вы используете Java 7, вместо этого используйте API новых файлов.

первый момент очень важен. Вы .close() в своем try блок; если вы можете успешно откройте файл, но не прочитать из него или что-то еще, .close() будет не называться. Вы должны сделать:

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

Для Java 7:

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

да, как javadoc показывает FileNotFoundException является наследником IOException.

если вы действительно хотитеFileNotFoundException, вы должны поймать только это execption, иначе ловить IOException также поймает любое исключение подклассов, как FileNotFoundException любые многие другие.