Рубрики
Без рубрики

Java Улавливает Несколько Исключений, Перестраивает Исключение

Java улавливает несколько исключений, исключения перестановки java, функция java 7 для перехвата нескольких исключений в одном улове, проверка времени компиляции исключения перестановки

Автор оригинала: Pankaj Kumar.

В Java 7 блок catch был улучшен для обработки нескольких исключений в одном блоке catch. Если вы улавливаете несколько исключений и у них одинаковый код, то использование этой функции уменьшит дублирование кода. Давайте разберемся в функции java catch с несколькими исключениями на примере.

Java улавливает несколько исключений

До Java 7 мы ловили несколько исключений одно за другим, как показано ниже.

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(IOException | SQLException ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

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

Исключение повторного расширения Java

Еще одно улучшение сделано в анализе компилятором переосмысленных исключений. Исключение Java rethrow позволяет указать более конкретные типы исключений в предложении throws объявления метода.

Давайте посмотрим на это на небольшом примере:

package com.journaldev.util;

public class Java7MultipleExceptions {

	public static void main(String[] args) {
		try{
			rethrow("abc");
		}catch(FirstException | SecondException | ThirdException e){
			//below assignment will throw compile time exception since e is final
			//e = new Exception();
			System.out.println(e.getMessage());
		}
	}

	static void rethrow(String s) throws FirstException, SecondException,
			ThirdException {
		try {
			if (s.equals("First"))
				throw new FirstException("First");
			else if (s.equals("Second"))
				throw new SecondException("Second");
			else
				throw new ThirdException("Third");
		} catch (Exception e) {
			//below assignment disables the improved rethrow exception type checking feature of Java 7
			// e=new ThirdException();
			throw e;
		}
	}

	static class FirstException extends Exception {

		public FirstException(String msg) {
			super(msg);
		}
	}

	static class SecondException extends Exception {

		public SecondException(String msg) {
			super(msg);
		}
	}

	static class ThirdException extends Exception {

		public ThirdException(String msg) {
			super(msg);
		}
	}

}

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

Обратите внимание, что этот анализ отключается, если вы измените аргумент блока catch.

Дальнейшее чтение: Обработка исключений в Java .