Изменения

Перейти к: навигация, поиск

Обработка ошибок и исключения

2142 байта добавлено, 15:33, 16 марта 2014
Исключения в Java7
==Исключения в Java7==
* обработка нескольких типов исключений в одном <code>catch</code>-блоке:
<code>catch</code> (<tt>IOException</tt> | <tt>SQLException</tt> ex) {...}
В таких случаях параметры неявно являются <code>final</code>, поэтому нельзя присвоить им другое значение в блоке <code>catch</code>.{{TODO| t=Преподаватель бы наверняка спросил, почему так сделано. Возможно стоит написать}}
Байт-код, сгенерированный компиляцией такого catch-блока будет короче, чем код нескольких catch-блоков. * <code>Try</code> с ресурсами позволяет прямо в <code>try</code> -блоке объявлять необходимые ресурсы, которые по завершению блока будут корректно закрыты (с помощью метода <code>close()</code>). Любой объект реализующий <code>java.lang.AutoCloseable</code> может быть использован как ресурс.
<tt>static String</tt> readFirstLineFromFile(String path) <tt>throws IOException</tt> {
}
В приведенном примере в качестве ресурса использутся объект класса <code>BufferedReader</code>, который будет закрыт вне зависимосити от того, как выполнится <code>try</code>-блок.
Можно объявлять несколько ресурсов, разделяя их точкой с запятой:
}
Во время закрытия ресурсов тоже может быть брошено исключение. В try-with-resources добавленна возможность хранения "подавленных" исключений, и брошенное <code>try</code>-блоком исключение имеет больший приоритет, чем исключения получившиеся во время закрытия. Получить последние можно вызовом метода <code>getSuppressed()</code> от исключения брошенного try-блоком. * Перебрасывание исключений с улучшенной проверкой соответствия типов. Компилятор Java SE 7 тщательнее анализирует перебрасываемые исключения. Рассмотрим следующий пример:  static class FirstException extends Exception { } static class SecondException extends Exception { } public void rethrowException(String exceptionName) throws Exception { try { if (exceptionName.equals("First")) { throw new FirstException(); } else { throw new SecondException(); } } catch (Exception ex) { throw e; } } В примере try-блок может бросить либо <code>FirstException</code>, либо <code>SecondException</code>. В версиях до Java SE 7 невозможно указать эти исключения в декларации метода, потому что catch-блок перебрасывает исключение <code>ex</code>, тип которого - <code>Exception</code>. В Java SE 7 вы можете указать, что метод <code>rethrowException</code> бросает только <code>FirstException</code> и <code>SecondException</code>. Компилятор определит, что исключение <code>Exception ex</code> могло возникнуть только в try-блоке, в котором может быть брошено <code>FirstException</code> или <code>SecondException</code>. Даже если тип параметра catch -блоком<code>Exception</code>, компилятор определит что это экземпляр либо <code>FirstException</code>, либо <code>SecondException</code>:  public void rethrowException(String exceptionName) throws FirstException, SecondException { try { // ... } catch (Exception e) { throw e; } }
{{TODO| t=Ещё можно упомянуть final rethrow}}Если <code>FirstException</code> и <code>SecondException</code> не являются наследниками <code>Exception</code>, то необходимо указать и <code>Exception</code> в объявлении метода.
==Примеры исключений==
Анонимный участник

Навигация