← Назад к вопросам

Что такое IOException?

1.6 Junior🔥 201 комментариев
#Soft Skills и карьера

Комментарии (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

  1. Файловые операции

    • Файл не найден (FileNotFoundException)
    • Нет прав доступа
    • Диск переполнен
    • Файл заблокирован другим процессом
  2. Сетевые операции

    • Соединение потеряно (SocketException)
    • Сервер недоступен
    • Timeout соединения
    • Неверный IP адрес
  3. Потоки данных

    • Поток закрыт
    • Конец потока достигнут (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Ошибка сокета (сеть)
SocketTimeoutExceptionTimeout сокета
InterruptedIOExceptionI/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 для ресурсов
  • Логируй все исключения
  • Ловишь специфичные исключения перед общими
  • Не игнорируй исключения молча
  • Используй кастомные исключения для специфичных случаев