Понимание Java IOException
Мне нужна помощь с пониманием IOException. Я просмотрел много информации в Интернете и посмотрел технические спецификации на веб-сайте Oracle Java.
Я правильно понимаю свое понимание класса IOException и всех его подклассов, что нет соответствующих значений "сообщения об ошибках" или "код возврата"?
Итак, если вы хотите выдать какое-либо сообщение и/или значение кода возврата, нужно было бы вставить их с логикой catch IOException?
Если вышесказанное верно, как можно отделить различные подклассы IOException?
например. Если приложение обнаружило исключение IOException, что такое IOException? End-Of-File, File-Is-Closed, File-Not_found, File-In-Use и т.д.
Ответы
Ответ 1
В исключениях (вообще) нет значений "код возврата", но они содержат сообщения об ошибках. И вы должны обрабатывать их в блоках catch
, где вы можете указать тип исключения, с которым вы хотите обращаться. Вы можете иметь несколько блоков catch
после блока try
, чтобы обрабатывать разные типы исключений по-разному. Блоки catch будут вызываться в указанном порядке, а первый с подходящим типом параметра будет обрабатывать исключение. Таким образом, вы должны сначала поймать более конкретные типы исключений, затем более общие.
Упрощенный пример:
try {
...
throw new FileNotFoundException("This is an error message");
...
} catch (FileNotFoundException e) {
System.out.println("File not found: " + e.getMessage());
...
} catch (EOFException e) {
System.out.println("End of file reached: " + e.getMessage());
...
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks
System.out.println("General I/O exception: " + e.getMessage());
e.printStackTrace();
...
}
Как вы видите в последнем блоке catch, исключения сохраняют трассировку стека их происхождения, которая может быть напечатана. Однако, как правило, не так хорошо печатать такие сообщения, как здесь; в реальном производственном коде вы обычно хотите регистрировать эти сообщения с помощью фреймворка регистрации или отображения (соответствующих частей) их в пользовательском интерфейсе.
Ответ 2
Кодов ошибок нет, но очень часто появляются сообщения. Например, они могут содержать имя файла или другие данные, которые помогут вам определить, что пошло не так.
Подробнее о том, какие исключения вы можете получить, см. в подклассах IOException.
Чтобы справиться с ними, вы можете использовать разные фразы catch
. Не забудьте переходить от более к менее конкретным исключениям (если вы поймаете IOException
в первом блоке, более конкретные блоки, такие как FileNotFoundException
, никогда не будут работать). Иногда вы можете поймать их всех с помощью одного catch (IOException)
- если вам не нужно обрабатывать подклассы другим способом.
try {
// ...
} catch (FileNotFoundException e) {
// ...
} catch (IOException e) {
// ...
}
Ответ 3
Вы должны подумать о том, какие исключения вы хотите обрабатывать определенным образом (а не с блоком catch catch). После того, как вы нашли своих кандидатов, вы должны поймать их в соответствии с их деревом наследования, тем более конкретным, а затем более общим (от подклассов до суперклассов). Помните, что если ваш черный список содержит слишком много исключений, которые должны быть пойманы, и они принадлежат только одной попытке, вы должны рассмотреть возможность разделения, которые пытаются блокировать на более мелкие фрагменты.
Ответ 4
Вы можете определить, какой класс является исключением или любым объектом, используя instanceof. Однако для исключений вы использовали бы блок catch.
} catch(FileNotFoundException e) {
// file not found handling
} catch(EOFException e) {
// handle reaching the End-Of_File.
} catch(IOException e) {
// generic IOException handling for any other IOException.
}
Ответ 5
Чтобы обработать подклассы IOException по-разному, вам придется поймать их отдельно, например:
try {
// some code that may throw an exception
}
catch (EOFException e) {
// handle an end-of-file exception here)
}
...
catch (IOException e) {
// handle an IOException that not covered in previous catch statements
}
catch (Exception e) {
// handle any other kind of exception
}