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

Где применяется throws?

1.3 Junior🔥 211 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключевое слово throws в Java

Throws используется для объявления, что метод может выбросить исключение. Это позволяет компилятору убедиться, что вызывающий код либо обработает исключение (try-catch), либо также объявит его (throws).

Синтаксис

public void methodName() throws ExceptionType1, ExceptionType2 {
    // код, который может выбросить исключения
}

Основное использование: Checked Exceptions

Throws используется для checked exceptions (исключения, которые компилятор обязывает обработать).

// IOException — это checked exception
// Компилятор обязывает либо catch'ить, либо throws'ить
public void readFile(String filename) throws IOException {
    FileReader reader = new FileReader(filename);
    // FileReader выбрасывает IOException, мы не обрабатываем, а пробрасываем
    int c = reader.read();
    reader.close();
}

// Вызывающий код должен обработать
public static void main(String[] args) {
    try {
        readFile("data.txt");
    } catch (IOException e) {
        System.out.println("Ошибка: " + e);
    }
}

Множественные исключения

Метод может объявить несколько типов исключений:

public void processFile(String filename) throws IOException, FileNotFoundException {
    FileReader reader = new FileReader(filename); // FileNotFoundException
    int c = reader.read(); // IOException
}

// Или более общий тип (parent type)
public void processFile(String filename) throws Exception {
    // Может выбросить любое Exception
}

Пример: работа с базой данных

// SQLException — checked exception в базах данных
public User findUserById(int id) throws SQLException {
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db");
    PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
    stmt.setInt(1, id);
    ResultSet rs = stmt.executeQuery(); // может выбросить SQLException
    
    if (rs.next()) {
        return new User(rs.getInt("id"), rs.getString("name"));
    }
    return null;
}

// Вызов
public static void main(String[] args) {
    try {
        User user = findUserById(1);
    } catch (SQLException e) {
        System.out.println("Ошибка БД: " + e);
    }
}

Пример: сетевые операции

// Чтение данных с сервера может выбросить IOException
public String fetchDataFromServer(String url) throws IOException {
    URL serverUrl = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();
    
    if (conn.getResponseCode() != 200) {
        throw new IOException("Server returned status: " + conn.getResponseCode());
    }
    
    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String result = br.readLine();
    br.close();
    
    return result;
}

// Использование
public void main() throws IOException {
    String data = fetchDataFromServer("https://api.example.com/data");
}

Throws vs Try-Catch

Вариант 1: throws (пробрасывание вверх)

public void readFile(String filename) throws IOException {
    FileReader reader = new FileReader(filename);
    // пробрасываем исключение выше
}

public void main() {
    try {
        readFile("data.txt");
    } catch (IOException e) {
        System.out.println("Обработка ошибки");
    }
}

Вариант 2: try-catch (обработка здесь)

public void readFile(String filename) {
    try {
        FileReader reader = new FileReader(filename);
        // обрабатываем здесь
    } catch (IOException e) {
        System.out.println("Обработка ошибки");
    }
}

public void main() {
    readFile("data.txt"); // нет throws
}

Цепочка throws

Исключение может пройти через несколько методов:

// Метод 1
public void method1() throws IOException {
    method2();
}

// Метод 2
public void method2() throws IOException {
    method3();
}

// Метод 3
public void method3() throws IOException {
    throw new IOException("Ошибка в методе 3");
}

// Вызов
public static void main(String[] args) {
    try {
        method1(); // IOException будет выброшена здесь
    } catch (IOException e) {
        System.out.println("Ошибка: " + e);
    }
}

// Стек вызовов:
// main() → method1() → method2() → method3() выбрасывает IOException
// IOException летит обратно: method3() → method2() → method1() → main() → catch

Пользовательские исключения с throws

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

public class BankAccount {
    private double balance;
    
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException(
                "Недостаточно средств. Баланс: " + balance + ", Запрос: " + amount
            );
        }
        balance -= amount;
    }
}

// Использование
public void main() {
    BankAccount account = new BankAccount();
    try {
        account.withdraw(1000);
    } catch (InsufficientFundsException e) {
        System.out.println(e.getMessage());
    }
}

Throws с Unchecked Exceptions

Технически можно объявить unchecked exceptions, но это необязательно:

// Необязательно объявлять unchecked exception, но можно
public void divide(int a, int b) throws ArithmeticException {
    int result = a / b; // может выбросить ArithmeticException
}

// Это тоже валидно (без throws)
public void divide(int a, int b) {
    int result = a / b; // может выбросить ArithmeticException
}

Лучшие практики

  1. Используй throws для checked exceptions — обязательное требование компилятора
  2. Не злоупотребляй throws — лучше обработать проблему локально
  3. Используй специфичные типы исключений — не просто Exception
  4. Документируй исключения — используй Javadoc @throws
/**
 * Читает файл и возвращает содержимое.
 * 
 * @param filename путь к файлу
 * @return содержимое файла
 * @throws FileNotFoundException если файл не существует
 * @throws IOException если ошибка при чтении
 */
public String readFile(String filename) throws FileNotFoundException, IOException {
    // ...
}
  1. Обрабатывай исключения близко к источнику — не пробрасывай всё вверх

Throws — это инструмент для явного объявления, какие исключения может выбросить метод. Это помогает写作者кода быть в курсе потенциальных проблем и обрабатывать их корректно.

Где применяется throws? | PrepBro