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

С какими Exceptions сталкивался в Java

2.3 Middle🔥 162 комментариев
#Java

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

С какими Exceptions сталкивался в Java?

В качестве QA Automation Engineer с фокусом на Java, работа с исключениями (Exceptions) — это неотъемлемая часть как разработки автотестов, так и анализа падений приложения. Исключения в Java делятся на два основных типа: checked (проверяемые) и unchecked (непроверяемые). В своей практике я сталкиваюсь с обоими, но в контексте автоматизации чаще возникают unchecked исключения, так как они связаны с ошибками времени выполнения, которые часто выявляются в процессе тестирования.

Checked Exceptions (Проверяемые исключения)

Это исключения, которые компилятор обязывает обрабатывать либо через try-catch, либо объявлять в сигнатуре метода с помощью throws. В автотестах они часто возникают при работе с I/O операциями или сетевыми запросами.

  • IOException и его подклассы (FileNotFoundException, EOFException): возникают при работе с файлами, сетью. Например, при чтении конфигурационных файлов для тестов или записи логов.
    try {
        BufferedReader reader = new BufferedReader(new FileReader("config.properties"));
    } catch (FileNotFoundException e) {
        // Обработка отсутствия файла, логирование, создание файла по умолчанию
    }
    
  • ParseException: при парсинге дат или сложных строк, например, в тестах, обрабатывающих данные из внешних источников.
  • SQLException: при работе с базами данных в интеграционных тестах, когда нужно проверить состояние БД после выполнения операций.

Unchecked Exceptions (Непроверяемые исключения)

Эти исключения наследуются от RuntimeException и не требуют обязательной обработки на этапе компиляции. В автотестах они часто сигнализируют о багах в тестируемом приложении или ошибках в логике самих тестов.

  • NullPointerException: одна из самых частых проблем. Возникает при попытке вызвать метод или обратиться к полю у null-ссылки. В автотестах — например, если ожидаемый объект на веб-странице (в Selenium) не найден и возвращает null.
    WebElement button = driver.findElement(By.id("submit"));
    button.click(); // NullPointerException, если элемент не найден
    
  • ArrayIndexOutOfBoundsException и IndexOutOfBoundsException: при обращении к несуществующему индексу массива или коллекции. Актуально при работе с динамическими списками в UI или при парсинге JSON/XML ответов в API-тестах.
  • IllegalArgumentException: когда методу передаётся некорректный аргумент. Например, при установке невалидного таймаута в WebDriverWait.
  • IllegalStateException: указывает на некорректное состояние объекта. В контексте Selenium WebDriver может возникать при попытке взаимодействия с браузером после его закрытия (driver.quit()).
  • NoSuchElementException (из Selenium): частый гость в UI-автотестах, когда локатор элемента не срабатывает. Хотя это исключение специфично для Selenium, оно является unchecked.
  • StaleElementReferenceException (Selenium): возникает, когда элемент был найден, но DOM изменился, и ссылка на элемент устарела. Требует перепоиска элемента.
  • TimeoutException (из java.util.concurrent или Selenium): при превышении времени ожидания, например, в WebDriverWait или при выполнении асинхронных операций.
  • AssertionError: хотя это не исключение в классической иерархии (наследуется от Error), в тестах он ведёт себя аналогично. Выбрасывается при провале утверждения в JUnit/TestNG (Assert.assertEquals(), assertTrue() и т.д.) и указывает на расхождение ожидаемого и фактического результата.
    @Test
    public void testLogin() {
        String actualTitle = driver.getTitle();
        Assert.assertEquals("Home Page", actualTitle); // AssertionError, если заголовок не совпал
    }
    

Обработка исключений в автотестах

В автотестах исключения используются не только для обработки ошибок, но и для валидации негативных сценариев. Например, мы можем ожидать, что при неверных данных приложение выбросит определённое исключение, и проверять это с помощью assertThrows() в JUnit 5.

@Test
public void testInvalidInputThrowsException() {
    Calculator calculator = new Calculator();
    // Проверяем, что при делении на ноль выбрасывается ArithmeticException
    assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
}

Также важно грамотно обрабатывать исключения в before/after методах (например, @AfterMethod в TestNG), чтобы гарантировать закрытие ресурсов (браузер, соединение с БД) даже при падении теста, и использовать логирование (например, через SLF4J + Logback) для записи деталей исключения, что критично для последующего анализа.

Таким образом, понимание иерархии и типов исключений в Java позволяет не только писать стабильные автотесты, но и эффективно анализировать причины их падений, разделяя ошибки в тестах и реальные дефекты приложения.