Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
IOException: ввод-вывод исключение
IOException — это проверяемое исключение в Java, которое возникает при ошибках вввода-вывода (I/O). Это одно из самых частых исключений, которые встречаются при работе с файлами, сетью и потоками данных.
Иерархия исключений
java.lang.Object
└── java.lang.Throwable
└── java.lang.Exception
└── java.io.IOException
├── FileNotFoundException
├── EOFException
├── SocketException
└── ... (и ещё ~30 подклассов)
IOException — это checked exception (проверяемое исключение), то есть его ОБЯЗАТЕЛЬНО нужно обрабатывать.
Основные причины IOException
-
Файловые операции
- Файл не найден (FileNotFoundException)
- Нет прав доступа
- Диск переполнен
- Файл заблокирован другим процессом
-
Сетевые операции
- Соединение потеряно (SocketException)
- Сервер недоступен
- Timeout соединения
- Неверный IP адрес
-
Потоки данных
- Поток закрыт
- Конец потока достигнут (EOFException)
- Некорректные данные
Примеры IOException
1. Чтение файла
import java.io.*;
public class FileReadExample {
public static void main(String[] args) {
try {
// Этот код может выбросить IOException
BufferedReader reader = new BufferedReader(
new FileReader("nonexistent.txt")
);
String line = reader.readLine();
reader.close();
} catch (FileNotFoundException e) {
// FileNotFoundException - подкласс IOException
System.out.println("Файл не найден: " + e.getMessage());
} catch (IOException e) {
// Ловим другие I/O ошибки
System.out.println("Ошибка при чтении: " + e.getMessage());
}
}
}
2. Запись в файл
import java.io.*;
public class FileWriteExample {
public static void writeToFile(String filename, String content) throws IOException {
try (FileWriter writer = new FileWriter(filename)) {
writer.write(content);
} catch (IOException e) {
System.out.println("Ошибка при записи в файл: " + e.getMessage());
throw e; // Пробрасываем дальше
}
}
}
3. Сетевые операции
import java.io.*;
import java.net.*;
public class NetworkExample {
public static void main(String[] args) {
try {
URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream)
);
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (IOException e) {
System.out.println("Ошибка при сетевом запросе: " + e.getMessage());
}
}
}
4. Работа с потоками
import java.io.*;
public class StreamExample {
public static void main(String[] args) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject("Hello World");
oos.close();
} catch (IOException e) {
System.out.println("Ошибка сериализации: " + e.getMessage());
}
}
}
Как обрабатывать IOException?
1. Try-Catch блок
public void readFile(String filename) {
try {
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line;
while ((line = reader.readLine()) != null) {
processLine(line);
}
reader.close();
} catch (IOException e) {
System.err.println("Ошибка при чтении файла: " + e.getMessage());
e.printStackTrace();
}
}
2. Try-With-Resources (рекомендуется)
Трай-виз-ресурсес АВТОМАТИЧЕСКИ закрывает ресурсы (AutoCloseable):
public void readFile(String filename) {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
while ((line = reader.readLine()) != null) {
processLine(line);
}
} catch (IOException e) {
System.err.println("Ошибка при чтении файла: " + e.getMessage());
}
// reader закроется автоматически
}
3. Пробросить исключение
public void readFile(String filename) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line;
while ((line = reader.readLine()) != null) {
processLine(line);
}
reader.close();
}
4. Цепочка исключений
public void processFile(String filename) {
try {
readAndProcess(filename);
} catch (IOException e) {
// Оборачиваем в кастомное исключение
throw new RuntimeException("Ошибка при обработке файла " + filename, e);
}
}
Подклассы IOException
| Класс | Описание |
|---|---|
| FileNotFoundException | Файл не найден |
| EOFException | Конец потока (неожиданно) |
| SocketException | Ошибка сокета (сеть) |
| SocketTimeoutException | Timeout сокета |
| InterruptedIOException | I/O операция прервана |
| SyncFailedException | Синхронизация не удалась |
// Пример с использованием подклассов
public void downloadFile(String url, String destination) {
try {
// Код
} catch (FileNotFoundException e) {
System.out.println("Файл для записи не может быть создан");
} catch (SocketTimeoutException e) {
System.out.println("Соединение истекло");
} catch (IOException e) {
System.out.println("Другая ошибка I/O");
}
}
Лучшие практики
1. Используй Try-With-Resources
// ХОРОШО
try (InputStream is = new FileInputStream("file.txt");
Reader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
processLine(line);
}
} catch (IOException e) {
log.error("Ошибка чтения файла", e);
}
2. Логируй исключения
public void processData(String filename) {
try {
readFile(filename);
} catch (IOException e) {
logger.error("Не удалось прочитать файл: " + filename, e);
// Не игнорируй исключение!
}
}
3. Не ловишь Exception (слишком широко)
// ПЛОХО
try {
readFile(filename);
} catch (Exception e) { // Слишком широко!
System.out.println("Ошибка");
}
// ХОРОШО
try {
readFile(filename);
} catch (IOException e) { // Специфичное исключение
System.out.println("Ошибка I/O");
}
4. Обрабатывай из самого специфичного к общему
try {
// Код
} catch (FileNotFoundException e) { // Самое специфичное
handleFileNotFound(e);
} catch (SocketException e) {
handleNetworkError(e);
} catch (IOException e) { // Более общее
handleIOError(e);
} catch (Exception e) { // Самое общее (избегай если можно)
handleUnexpectedError(e);
}
Проверяемое vs Непроверяемое исключение
// IOException - CHECKED (проверяемое)
// ОБЯЗАТЕЛЬНО обработать или пробросить
public void readFile() throws IOException {
// код
}
// NullPointerException - UNCHECKED (непроверяемое)
// Не требует обработки (но можно)
public void doSomething() {
String str = null;
str.length(); // Выбросит NPE
}
Кастомное исключение на основе IOException
public class FileProcessingException extends IOException {
private String filename;
public FileProcessingException(String filename, String message) {
super(message);
this.filename = filename;
}
public FileProcessingException(String filename, String message, Throwable cause) {
super(message, cause);
this.filename = filename;
}
public String getFilename() {
return filename;
}
}
// Использование
public void processFile(String filename) throws FileProcessingException {
try {
// код
} catch (IOException e) {
throw new FileProcessingException(filename, "Ошибка обработки файла", e);
}
}
Итоговый чеклист
- IOException — это checked exception для I/O ошибок
- Всегда используй try-with-resources для ресурсов
- Логируй все исключения
- Ловишь специфичные исключения перед общими
- Не игнорируй исключения молча
- Используй кастомные исключения для специфичных случаев