Перехват исключений 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
любые многие другие.