Java捕获多个异常,重新抛出异常

时间:2020-02-23 14:36:24  来源:igfitidea点击:

在Java 7中,对catch块进行了改进,可以在单个catch块中处理多个异常。
如果捕获多个异常并且它们具有相似的代码,则使用此功能将减少代码重复。
让我们通过一个示例来了解Java捕获多个异常功能。

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.theitroad.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块正在捕获Exception,但它不是throws子句的一部分。
Java 7编译器分析完整的try块,以检查抛出了哪些类型的异常,然后将其从catch块中抛出。