摘要:Java中多重异常捕获机制可以更加简洁、有效地处理多个异常,提高了程序的鲁棒性,是编写高质量代码的重要技巧之一。

  小编在《浅谈Java异常处理机制》中梳理了异常处理机制,在《Java 异常处理try、catch、finally和return执行顺序》中介绍了异常处理时,try、catch、finally和return的执行顺序,本文介绍如何使用catch捕获多个异常。

  当我们编写代码时,经常会遇到异常,如文件不存在、空指针、数组下标越界等等异常。因为异常的发生可能会导致程序崩溃,因此需要对异常进行捕获和处理。对异常处理有三个核心关键字:try、catch、finally,常用使用方法如下:

try {
//有可能出现异常的语句
} catch (异常类型A 对象) {
//异常处理methodA
} catch (异常类型B 对象) {
//异常处理methodB
} finally {
//不管有没有出现异常,这里的代码都会执行
}

  我们在try语句中捕获可能出现异常的代码。如果try捕获到异常,则会与和它匹配的catch中的异常类型依次进行比对,如果相同则进行处理;如果不匹配,则继续匹配后续的catch类型;如果都不匹配,那么表示该异常无法由catch块处理,需要采用JVM默认的异常处理方式进行处理。最后不管有没有异常,都会执行finally中的语句块。温馨提示:finally语句块可以省略,如果省略,则在执行完catch语句块之后,程序继续执行后边的代码。

  Java提供的 catch 代码块虽然客观上提高了程序的健壮性,但是也导致了程序代码量大大增加。如果有些异常种类不同,但捕获之后的处理逻辑是相同的,例如把methodB换成了methodA,则可以使用如下多重异常捕获技术:

try {
//有可能出现异常的语句
} catch (异常类型A | 异常类型B 对象) {
//异常处理methodA
} finally {
//不管有没有出现异常,这里的代码都会执行
}

  什么是多重异常捕获?就是在同一个catch语句块中捕获多种不同的异常,多个异常类型之间使用管道符|隔开。

  使用多重异常捕获时,如下几点需要各位老铁注意:

  • 多种异常类型之间用管道符|隔开。
  • 捕获多种类型的异常时,异常变量被隐式的 final 修饰,因此不能对异常变量重新赋值。
  • 在捕捉异常时,请记录异常信息,以便定位问题。
  • 多个异常类型必须是从小到大排列,即父类异常必须放在子类异常之后,这是因为Java会优先匹配catch语句的第一个参数。
  • 尽可能使用特定的异常类型来捕获异常。这可以帮助你更准确地识别问题,并采取适当的措施。例如,如果你正在处理文件读取错误,则可以捕获FileNotFoundException异常。
  • 避免捕获所有异常。这可能会掩盖真正的问题,并使调试变得更加困难。相反,只捕获你预计可能会出现的异常。

  下面程序示范了多异常捕获。

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 finalExc) {
System.out.println("发生了数组越界、数字格式异常、算术异常之一");
// 捕获多异常时,异常变量默认有final修饰,故下面的代码有错:
// finalExc = new ArithmeticException("test");
} catch (Exception e) {
System.out.println("未知异常");
// 捕获一种类型的异常时,异常变量没有final修饰,所以下面代码完全正确
e = new RuntimeException("test");
}
}
}

  上面程序中第一个catch块使用了IndexOutOfBoundsException|NumberFormatException|ArithmeticException来定义需要拦截的异常类型,它表明该 catch 块可以同时捕获这 3 种类型的异常。捕获多种类型的异常时,异常变量使用隐式的 final 修饰,因此如果去掉finalExc = new ArithmeticException("test"); 前面的注释,代码将产生编译错误,提示Cannot assign a value to final variable 'finalExc';但是,捕获一种类型的异常时,异常变量没有被final关键词修饰,因此e = new RuntimeException("test")可以编译通过。

  由于NumberFormatException是Exception的子类,所以,把Exception放在了NumberFormatException后面;否则,后者起不到作用。

Java catch多重异常捕获的更多相关文章

  1. java 异常的捕获及处理

    在没有异常处理的程序中如果要回避异常,需要使用大量的判断语句,配合所想到的错误状况来捕捉程序中可能发生的错误.但是这样势必会导致程序运行效率降低.java异常处理机制具有易于使用,可自定义异常类,处理 ...

  2. java 异常与捕获

    几乎所有的代码里面都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要进行异常处理. 先来看一下异常的继承类结构: 所有的异常都是由Throwable继承而来,我们来看他下面的两个子类Er ...

  3. Java & Android未捕获异常处理机制

    一.背景 无论是Java还是Android项目,往往都会用到多线程.不管是主线程还是子线程,在运行过程中,都有可能出现未捕获异常.未捕获异常中含有详细的异常信息堆栈,可以很方便的去帮助我们排查问题. ...

  4. Java 正则表达式之捕获组

    Java 正则表达式之捕获组 1. Java 正则表达式基础 2. Java 正则表达式之捕获组 一.概述 1.1 什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显 ...

  5. Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程

    Java并发-UncaughtExceptionHandler捕获线程异常信息并重新启动线程 一.捕获异常并重新启用线程 public class Testun { public static voi ...

  6. java异常处理 throw RuntimeException时不需要同时方法中声明抛出throws 异常等待调用者catch进行捕获 子父类异常问题

    package com.swift.exception1; public class Demo_Exception { public static void main(String[] args) { ...

  7. IOS开发之--异常处理--使用try 和 catch 来捕获错误。

    一个搞java的老板问我会不会try catch  我说不会 学这么久也没听周围朋友用这个 因为苹果控制台本来就可以打印异常 特此研究一下. 1.try catch:  是捕获异常代码段   特点:对 ...

  8. JAVA异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  9. 【开发技术】java异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  10. Java -- 异常的捕获及处理 -- Java的异常处理机制

    7.1.4 Java的异常处理机制 在整个Java的异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下: ⑴ : 一旦产生异常,则首先会产生一个异常类的实例化对象. ⑵ : 在try语句 ...

随机推荐

  1. 【论文随笔】会话推荐系统综述(A Survey on Conversational Recommender Systems)

    前言 今天读的论文为一篇于2021年5月发表在<ACM计算机调查>(ACM Computing Surveys)的论文,文章提供了对话式推荐系统(CRS)的全面综述,探讨了CRS的定义.概 ...

  2. 【VMware by Broadcom】VMware 产品套件(2025)

    VMware 被 Broadcom 收购后(现为 VMware by Broadcom),重新调整了其产品部门并最终优化为了四个,分别是:VMware Cloud Foundation(VCF)部门. ...

  3. 【Python】批量提取Fibersim xml文件中的节点网格数据

    程序功能: 输入需求: fibersim导出的ply 的xml文件,可以很多个也没问题.但名字要有规律,不然没法循环读写.比如我自己用的就是x1.xml.x2.xml.Y1.xml......的文件名 ...

  4. Tauri新手向 - 基于LSB隐写的shellcode加载器

    此篇是记录自己初次学习tauri开发工具,包含遇到的一些问题以及基本的知识,也给想上手rust tauri的师傅们一些小小的参考.此项目为保持免杀性暂不开源,希望各位师傅多多支持,反响可以的话后续会放 ...

  5. Go Module使用 六大场景讲解示例

    前言 通过学习Go是怎么解决包依赖管理问题的?.go module基本使用,我们掌握了 Go Module 构建模式的基本概念和工作原理,也初步学会了如何通过 go mod 命令,将一个 Go 项目转 ...

  6. vue学习一(指令3.v-on,v-for)

    3.1.v-on 绑定事件  可以简写为@ ,按键修饰符    v-on:keyup    =    @keyup 事件修饰符:v-on提供了事件修饰符 修饰符是由点开头的指令后缀来表示的       ...

  7. Hack The Box-代理连接及靶机-Meow-喵呜

    前言 ​ 在第一层,您将获得网络安全渗透测试领域的基本技能.您将首先学习如何匿名连接到各种服务,例如 FTP.SMB.Telnet.Rsync 和 RDP.接下来,您将发现 Nmap 的强大功能,这是 ...

  8. supOS蓝卓工业互联网与iNeuOS工业互联网操作系统对比

    最近有一个企业正在调研工业互联网平台,其中调研的是supOS蓝卓工业互联网和iNeuOS工业互联网操作系统.让我们给出一个对比情况表,我们自己总结了一份,由于不太了解supOS,于是也问了deepse ...

  9. springboot将对象输出成文件流传到前端

    springboot将对象输出成文件流传到前端 依赖 Controller service 运行 依赖 cn.hutool hutool-all 5.7.20 Controller /** * TIT ...

  10. 静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析

    静态批处理[1] 定义 标明为 Static 的静态物件,如果在使用相同材质球的条件下,在Build(项目打包)的时候Unity会自动地提取这些共享材质的静态模型的Vertex buffer和Inde ...