Понимание 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
}