前面我们学习的多 catch 代码块虽然客观上提高了程序的健壮性,但是也导致了程序代码量大大增加。如果有些异常种类不同,但捕获之后的处理是相同的,例如以下代码。
try{ // 可能会发生异常的语句} catch (FileNotFoundException e) { // 调用方法methodA处理} catch (IOException e) { // 调用方法methodA处理} catch (ParseException e) { // 调用方法methodA处理}
3 个不同类型的异常,要求捕获之后的处理都是调用 methodA 方法。为了解决这种问题,Java 7 推出了多异常捕获技术,可以把这些异常合并处理。上述代码修改如下:
try{ // 可能会发生异常的语句} catch (IOException | ParseException e) { // 调用方法methodA处理}
注意:由于 FileNotFoundException 属于 IOException 异常,IOException 异常可以捕获它的所有子类异常。所以不能写成 FileNotFoundException | IOException | ParseException 。
使用一个 catch 块捕获多种类型的异常时需要注意如下两个地方。
捕获多种类型的异常时,多种异常类型之间用竖线|隔开。
填写下面表单即可预约申请免费试听java课程!害怕学不会?助教陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
捕获多种类型的异常时,异常变量有隐式的 final 修饰,因此程序不能对异常变量重新赋值。
下面程序示范了 Java 7 提供的多异常捕获。
public class ExceptionTest { public static void main(String[] args) { try { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); int c = a / b; System.out.println("您输入的两个数相除的结果是:" + c); } catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) { System.out.println("程序发生了数组越界、数字格式异常、算术异常之一"); // 捕获多异常时,异常变量默认有final修饰 // 所以下面代码有错 e = new ArithmeticException("test"); } catch (Exception e) { System.out.println("未知异常"); // 捕获一种类型的异常时,异常变量没有final修饰 // 所以下面代码完全正确 e = new RuntimeException("test"); } }}
上面程序中第 一行粗体字代码使用了IndexOutOfBoundsException|NumberFormatException|ArithmeticException来定义异常类型,这就表明该 catch 块可以同时捕获这 3 种类型的异常。捕获多种类型的异常时,异常变量使用隐式的 final 修饰,因此上面程序的第 12 行代码将产生编译错误;捕获一种类型的异常时,异常变量没有 final 修饰,因此上面程序的第 17 行代码完全正确。
下一篇: 没有了
一级建造师二级建造师消防工程师造价工程师土建职称房地产经纪人公路检测工程师建筑八大员注册建筑师二级造价师监理工程师咨询工程师房地产估价师 城乡规划师结构工程师岩土工程师安全工程师设备监理师环境影响评价土地登记代理公路造价师公路监理师化工工程师暖通工程师给排水工程师计量工程师
执业药师执业医师卫生资格考试卫生高级职称护士资格证初级护师主管护师住院医师临床执业医师临床助理医师中医执业医师中医助理医师中西医医师中西医助理口腔执业医师口腔助理医师公共卫生医师公卫助理医师实践技能内科主治医师外科主治医师中医内科主治儿科主治医师妇产科医师西药士/师中药士/师临床检验技师临床医学理论中医理论