今天在阅读项目代码时看到如下奇怪的代码,以为是竖线 | 可以作为多类型赋值,经过网上搜索才知道是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就是不可变变量,因此在该语句块内你不能赋任何值给它。

java多层catch语句_Java异常之catch语句块相关推荐

  1. java catch后面_java 异常被catch后 将会继续执行的操作

    我就废话不多说了,大家还是直接看代码吧~ import java.util.UUID; public class Test { public static void main(String[] arg ...

  2. java try catch陷阱_java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)...

    1.    异常捕捉的陷阱 异常处理机制是java语言的特色之一,尤其是java语言的Checked异常,更是体现了java语言的严谨性:没有完善错误处理的代码根本不会被执行.对于Checked异常, ...

  3. java try 返回值_JAVA的try... catch finally的return返回值问题

    下面看一个例子(例1),来讲解Java里面中try.catch.finally的处理流程 public class TryCatchFinally { @SuppressWarnings(" ...

  4. java try的用法_Java中try()catch{}的使用方法

    今天撸代码的时候发现了一段这样的代码 try( Connection conn=DriverManager.getConnection(url,user,pass); Statement stmt=c ...

  5. java try的用法_Java try和catch的使用

    为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了.紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句.完成这个任务很简单,下面的程序包含一个处理因为被零除而 ...

  6. java 异常处理的关键字_java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类...

    packagecn.kecheng;importjava.util.Scanner;/**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中通过异常 ...

  7. java循环基础知识_Java基础知识·循环语句

    掘友们,大家好呀,我是宸道. 今天要讲解的是Java基础的循环语句,虽然很基础但还是希望大家看完,就当时复习知识了,基础越牢固越好,对我们是有很大帮助的. 相关推荐 循环语句可以在满足循环条件的情况下 ...

  8. java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--捕获异常+再次抛出异常与异常链 的相关知识: [1]捕获异常相关 1.1)如果 ...

  9. java catch自定义异常_java异常类-java自定义异常-嗨客网

    Java异常类教程 我们在 我们可以看到,在 Exception 表示的是程序中出现了问题,可以直接使用 try - catch 来捕获处理.Error 一般值 Java常见异常 类名 描述 IOEx ...

最新文章

  1. mysql 截断表_入门MySQL——基础语句篇
  2. 计算机视觉深度学习顶会_顶会论文接收量再破纪录,计算机视觉创新正在发生什么变化?丨 CVPR 2019分享会...
  3. Python D6 if分支结构
  4. 数据结构之图定义及相关概念
  5. c++tcp接收文件缓存多大合适_linux高性能网络编程之tcp连接的内存使用
  6. flutter 微信语言选择_flutter实战项目,教你使用flutter打造微信app页面!
  7. Pyramid Stereo Matching Network
  8. 【链表】剑指offer:反转链表
  9. Git:操作报错:fatal: ‘origin‘ does not appear to be a git repository解决方案
  10. 从调试数据分析USB通信协议——UVC摄像头【UVC类设备】(五)
  11. 青蒿素发现者与两外籍科学家共获诺奖
  12. vue 使用pug(详细说明)
  13. 对前端构建工具的一些理解
  14. java word 替换_Java 在 Word 文档中使用新文本替换指定文本的方法
  15. Padavan编译技巧
  16. flowable工作流架构介绍及集成实现
  17. TCP/IP原理浅析
  18. Web开发了一个完整精美的聊天室(登录部分引入了Vue技术)
  19. mysql 热备份 数据一致性_MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]
  20. 在CAD中插入谷歌地球卫星地图

热门文章

  1. 报告称中国出境游客移动支付消费首次超现金
  2. BigDecimal 使用详解
  3. Cookie的生命周期
  4. MySQL编译安装及主从配置
  5. 文件/目录权限相关命令:chmod、chown、umask、lsattr/chattr命令解析
  6. xen 虚拟机挂了,宿主机假死的问题追终,全思路
  7. 你不可不知的家庭装修禁忌
  8. 关于Git和Github你不知道的十件事
  9. Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
  10. Linux下安装Tomcat