· Try Blocks
· Catch Blocks
· Finally Blocks
· Собираем все вместе
· Вложенные try-блоки
· Поймать несколько исключений

Попробуйте заблокировать

Блоки try — это первая часть блоков try/catch. Они содержат любой код, который может вызвать исключение. В Java, когда мы не уверены в результате оператора, мы можем поместить эти операторы в этот блок try. Блок try может использоваться в методе или другом блоке try.

За блоком try всегда следует блок catch, который обрабатывает исключение, возникающее в соответствующем блоке try.

Для IOExceptions поместите любой код, который создает, читает, записывает или закрывает файл внутри блока try.

Синтаксис

Первым шагом в создании обработчика исключений является включение кода, который может вызвать исключение, в блок try. В общем случае блок try выглядит следующим образом:

try {
    code
}
catch and finally blocks . . .

Сегмент в примере с помеченным кодом содержит одну или несколько допустимых строк кода, которые могут вызвать исключение. (Блоки catch и finally объясняются в следующих двух подразделах.)

Пример

Чтобы создать обработчик исключений для метода writeList из класса ListOfNumbers, заключите операторы исключения для метода writeList в блок try. Существует несколько способов сделать это. Вы можете поместить каждую строку кода, которая может вызвать исключение, в отдельный блок try и предоставить для каждой отдельные обработчики исключений. Или вы можете поместить весь код writeList в один блок try и связать с ним несколько обработчиков. В следующем листинге для всего метода используется один блок try, поскольку рассматриваемый код очень короткий.

private List<Integer> list;
private static final int SIZE = 10;

public void writeList() {
    PrintWriter out = null;
    try {
        System.out.println("Entered try statement");
        FileWriter f = new FileWriter("OutFile.txt");
        out = new PrintWriter(f);
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    }
    catch and finally blocks  . . .
}

Если в блоке try возникает исключение, это исключение обрабатывается связанным с ним обработчиком исключений. Чтобы связать обработчик исключений с блоком try, вы должны поместить после него блок catch; в следующем разделе Блоки catch показано, как это сделать.

Попробуйте блокировать боковые заметки

  • Наряду с кодом, который может вызывать исключение, блоки try могут (но не обязательно) содержать код, не вызывающий исключений.
  • Программы могут содержать более одного блока try. Кроме того, один блок try может находиться внутри другого блока try.

Поэтому, если при написании программы вы думаете, что определенные операторы в программе могут генерировать исключение или ряд исключений, заключите их в блок try и обработайте это исключение плавно, не мешая работе программы.

Поймать блоки

Вторая половина блока try/catch — это блок catch. В то время как блоки try содержат код, вызывающий исключение, блоки catch содержат код, обрабатывающий исключение.

В Java блок catch используется для обработки исключения, перехваченного блоком try. Блок catch включает в себя код и выполняется, если возникает исключение внутри блока try. Если система сталкивается с исключением при выполнении операторов в блоке try, она пропускает остальные операторы и передает управление соответствующему блоку catch.

Блок catch перехватывает и обрабатывает исключения блока try, объявляя тип исключения в параметре. Объявленное исключение в блоке catch должно быть исключением родительского класса (т. е. Exception) или сгенерированным типом исключения. Однако лучший подход — объявить сгенерированный тип исключения.

Блок catch всегда следует за блоком try. Как только управление выходит из блока try, вернуть его обратно в блок try невозможно.

Синтаксис

Вы связываете обработчики исключений с блоком try, предоставляя один или несколько блоков catch непосредственно после блока try. Никакой код не может находиться между концом блока try и началом первого блока catch.

try {
  
} catch (ExceptionType name) {

}

Каждый блок catch является обработчиком исключения, который обрабатывает тип исключения, указанный его аргументом. Тип аргумента, ExceptionType, объявляет тип исключения, которое может обрабатывать обработчик, и должен быть именем класса, наследуемого от класса Throwable. Обработчик может ссылаться на исключение с имя.

Блок catch содержит код, который выполняется при вызове обработчика исключений. Система выполнения вызывает обработчик исключений, когда обработчик является первым в стеке вызовов, чей ExceptionType соответствует типу выброшенного исключения. Система считает совпадением, если брошенный объект может быть легально присвоен аргументу обработчика исключений.

Перехват аргументов блока

Блоки перехвата принимают один аргумент, тип исключения, которое они должны перехватывать (обрабатывать). Эти аргументы могут варьироваться от очень специфического типа исключения до очень общей универсальной категории исключений.

Пример

Ниже приведены два обработчика исключений для метода writeList:

try {

} catch (IndexOutOfBoundsException e) {
    System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

Обработчики исключений могут делать больше, чем просто печатать сообщения об ошибках или останавливать программу. Они могут выполнять восстановление после ошибок, предлагать пользователю принять решение или распространять ошибку до обработчика более высокого уровня, используя цепочку исключений.

Содержимое блока захвата

Содержимое блока catch — это то, что вы хотите, чтобы произошло при возникновении исключения (например, когда доступ к файлу не существует). Вы можете либо распечатать сообщение, либо иметь код, который делает что-то для исправления ошибки (например, имя файла еще раз.

Блокировка сообщений Catch (отображение описания исключения)

Вы можете напечатать любое сообщение внутри блока catch.

Использование toString()

Throwable переопределяет метод toString() (определенный Object), так что он возвращает строку, содержащую описание исключения. Вы можете отобразить это описание в операторе println(), просто передав исключение в качестве аргумента. Например, блок catch в предыдущей программе можно переписать так:

catch (ArithmeticException e) {
    System.out.println("Exception: " + e);
    a = 0; // set a to zero and continue
  }

Когда эта версия заменяется в программе и программа запускается, каждая ошибка деления на ноль отображает следующее сообщение:

Exception: java.lang.ArithmeticException: / by zero

В Java также есть несколько методов, предназначенных для обработки исключений определенным образом. Пара из них:

  • getMessage(): возвращает сообщение об ошибке, специфичное для каждого типа исключения. Соедините это с оператором println.
  • printStackTrace(): печатает тип ошибки и место ее возникновения в программе. Эти методы особенно полезны для отладки и поиска причины исключения.

Поймать блок боковые примечания

  • В каждом блоке try должен быть хотя бы один блок catch.
  • Блоки try могут иметь несколько блоков catch. См. пример справа.
  • Блоки catch должны идти сразу после блока try, с которым они связаны.

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

Наконец блоки

Ключевое слово finally используется для создания блока кода, следующего за блоком try. Блок finally всегда выполняется независимо от того, произошло исключение или нет. Используя блок finally, он позволяет запускать любые операторы типа очистки, которые вы хотите выполнить, независимо от того, что происходит в защищенном коде. Блок finally появляется в конце блока catch. блоки finally используются для аннулирования ссылок на объекты и закрытия потоков ввода/вывода.

Блок finally всегда выполняется при выходе из блока try. Это гарантирует, что блок finally будет выполнен, даже если возникнет непредвиденное исключение. Но finally полезен не только для обработки исключений — он позволяет программисту избежать случайного обхода кода очистки с помощью return, continue или разрыв. Размещение кода очистки в блоке finally всегда является хорошей практикой, даже если исключений не ожидается.

Система выполнения всегда выполняет операторы в блоке finally независимо от того, что происходит в блоке try. Так что это идеальное место для уборки.

Синтаксис

finally {
  // cleanup code
  }

Пример

Следующий блок finally для метода writeList очищает, а затем закрывает PrintWriter и FileWriter.

finally {
    if (out != null) { 
        System.out.println("Closing PrintWriter");
        out.close(); 
    } else { 
        System.out.println("PrintWriter not open");
    } 
    if (f != null) {
	    System.out.println("Closing FileWriter");
	    f.close();
	}	
}

Наконец боковые примечания

  • Блоки finally являются необязательным дополнением к блокам try/catch.
  • Наконец, блоки используются для кода, который вы хотите запускать независимо от того, что происходит с вашим кодом.
  • Это последнее, что выполняется, и они будут выполняться каждый раз, когда вы запускаете свою программу.
  • Одно из применений блока finally — убедиться, что файл закрыт в конце программы.

Собираем все вместе

private List<Integer> list;
private static final int SIZE = 10;

public void writeList() {
    PrintWriter out = null;
    try {
        System.out.println("Entered try statement");
        FileWriter f = new FileWriter("OutFile.txt");
        out = new PrintWriter(f);
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    } 
    // catch blocks
    catch (IndexOutOfBoundsException e) {
        System.err.println("IndexOutOfBoundsException: " + e.getMessage());
    } 
    catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    }
    // finally block
  finally {
    if (out != null) { 
        System.out.println("Closing PrintWriter");
        out.close(); 
    } else { 
        System.out.println("PrintWriter not open");
    } 
    if (f != null) {
     System.out.println("Closing FileWriter");
     f.close();
 } 
}
}

Вложенные блоки try

Когда используются вложенные блоки попыток, сначала выполняется внутренний блок попытки. Любое исключение, созданное во внутреннем блоке try, перехватывается в соответствующем блоке catch. Если соответствующий блок catch не найден, проверяется блок catch внешнего блока try. Этот процесс продолжается до тех пор, пока не будут исчерпаны все вложенные операторы try. Если соответствующий блок catch не найден, программа аварийно завершается.

посетите вложенный блок try-catch.

Перехват нескольких исключений

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

Пример:

catch (IOException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
catch (SQLException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

В Java 7 блок catch был улучшен для обработки нескольких исключений в одном блоке catch.

Пример:

catch(IOException | SQLException ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

посетите его обработка нескольких исключений в Java

Приятного обучения 😃

Присоединяйтесь к группе Mouad Oumous Java WhatsApp JOIN

Присоединяйтесь к Telegram-каналу Mouad Oumous JOIN

Поддержите нашу публикацию, подписавшись на нее