Java异常之catch语句块

翻译 2015年11月21日 00:05:19

今天在阅读项目代码时看到如下奇怪的代码,以为是竖线 | 可以作为多类型赋值,经过网上搜索才知道是Java SE 7新增的功能:一个catch捕获多种类型的异常。原文是Java官方的文档,现翻译如下。红字为个人备注。

public String selectByRule(String ruleId) {
	try {
		selectService.select(ruleId, null, false);		
	        return "success";
	} catch (InstantiationException | IllegalAccessException e) {
		e.printStackTrace();
		return "failure";
	}	
}


catch块

我们使用一个try语句块以及紧随其后的一个或多个catch语句块来实现异常处理器。注意,在try语句块和第一个catch语句块之间不能有其他代码,示例如下。

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}
每个catch块即是一个异常处理器,catch的参数表明了其所处理的异常的类型。示例中的参数类型ExceptionType,定义了该异常处理器可以处理的异常类型,并且参数类型ExceptionType必须是一个继承自Throwable的类的名字。 异常处理器可以通过name变量读取到所捕捉的异常。

当异常处理器被调用时,对应的catch块内的代码才会执行。那么异常处理器是何时被调用的呢?当某异常处理器的ExceptionType是调用栈上第一个匹配所抛异常的类型时,运行时系统(runtime system)就会调用该异常处理器。只要抛出的对象可以被合法地赋值给异常处理器的参数,运行时系统就会把该异常处理器当作一个匹配。也就是说父类类型如果在前面,可以屏蔽掉后面更精准的子类,如Exception可以匹配所有的异常,这样就是所谓的宽泛异常。

如下的代码片段是writeList方法的两个异常处理器:

try {

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

异常处理器可以做的不仅仅是打印错误消息、终止程序。此外,它们还可以进行错误恢复,提示用户做出决定,或者利用异常链把错误传递给更高层级的异常处理器,即如在异常链(Chained Exceptions)章节中所述的。

一个异常处理器如何捕获多种类型的异常

在Java SE 7或者更高版本中,一个catach块可以处理不止一种异常类型。Java的这个功能可以减少重复代码、降低捕获过于宽泛的异常的诱惑。使用方式是,在catch语句中,指明该catch语句块可以处理的异常的类型(们),并使用竖线(|)把各个异常类型隔开,示例如下:
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}
注意:如果catch语句块要处理多种异常类型,那么catch的参数隐式地成为不可变(final)变量。在上例中,catch参数ex就是不可变变量,因此在该语句块内你不能赋任何值给它。

原文地址:https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

相关文章推荐

java try catch块的简单解析

try catch作用是抓取异常, 快速添加方式:选中部分需要异常抓取的块,右击鼠标,鼠标放在source with 即可看到 try catch 块 package a13; import java...

try~Catch语句中异常的处理过程

简单介绍try~catch~throw~finally

java 异常处理的语句执行

概念 1.try 如果在一个方法内部出现了异常(或者在方法内部调用的其他方法抛出了异常),这个方法将在抛出异常的过程中结束。 异常处理理论上有两种基本模型。终止模型和恢复模型。个人理...

java split | (竖线)

java split | (竖线) 在java中,有一个字符串"866|10|1824261|214|",需要根据“|”截取。 而直接用split("|");是不行的。 原因是竖线 | 在正则中...

java异常语句中catch,finally的执行顺序

在使用MyEclipse编程时,我发现一个问题:如下代码,当出现异常时,有时候会先执行catch里的语句,而有时候会先执行finally里的语句: public class Calc { publ...

try_catch_finally异常处理java

  • 2013-06-11 23:25
  • 4.36MB
  • 下载

异常处理try catch语句的执行顺序

1, 不管由于没有出现异常,finally块中的代码都执行,除非在进入try语句之前程序异常退出,后着在try语句中出现sys.exit 2,
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)