首页 > 编程语言 >Java catch多重异常捕获

Java catch多重异常捕获

时间:2023-06-21 21:35:11浏览次数:53  
标签:Java 处理 捕获 try finally catch 异常

摘要: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,处理,捕获,try,finally,catch,异常
From: https://www.cnblogs.com/east7/p/17497167.html

相关文章

  • java中如何检测死锁
    首先创建一个程序,写两个线程publicclass死锁{privatestaticfinalStringlock1="lock1";privatestaticfinalStringlock2="lock2";publicstaticvoidmain(String[]args){Threadthread1=newThread(()->{......
  • tomcat config java option
    https://stackoverflow.com/questions/53230473/set-a-basic-java-option-on-tomcathttps://docs.oracle.com/cd/E40518_01/integrator.311/integrator_install/src/cli_ldi_server_config.htmlFollowTomcatconfigurationrecommendationsUpdatesetenv.batwithadding......
  • java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
    java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?答案2023-06-21:java的:这个问题,我问了一些人,部分人是回答得有问题的。synchronized这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,synch......
  • java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
    java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?答案2023-06-21:java的:这个问题,我问了一些人,部分人是回答得有问题的。synchronized这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,s......
  • 54基于java的高校图书馆座位预约系统设计与实现
    本章节给大家带来一个基于java的座位预约系统,可以用于图书馆占位系统,图书馆座位预约系统,大学自习室占座系统,自习室座位预约系统,图书馆预约占座系统,自习室预约占座系统,高校图书馆座位预约系统等等;下面以图书馆为例,大家把源码下载下来后,还可以修改图书馆名字改成自习室或者阅览室......
  • Java匿名内部类
    classOuter{publicvoidf(){IAia=newIA(){@Overridepublicvoidsay(){System.out.println("hi~");}};ia.say();System.out.println(ia.getClass().get......
  • Java基础-Day01
    Java基础-Day01JDKJREJVM关系JDK=(Java开发工具包)=Java的开发工具(javac.exe,java.exe,javadoc.exe等)+JRE(Java运行环境)JRE=JVM(Java虚拟机)+Java核心类库JDK的下载、安装下载:官网,gitbub安装:傻瓜式安装:JDK/JRE注意问题:安装软件的路径中不能包含中文、空格为什么要配......
  • 【淘宝API接口系列】获取sku详细信息Java获取源代码演示
    ​ 淘宝商品SKU详细信息API接口是指通过开放平台提供的API接口,可以根据商品ID和SKUID等参数,获取淘宝商品SKU的详细信息,包括SKU的价格、库存、销售属性、skuUrl、sku图片等。其作用是方便开发者通过调用API接口,获取淘宝商品SKU的详细信息,进而实现商品价格比较、商品数据采集、......
  • iOS开发笔记 - Objective-C和JavaScript的混编
    最近看了一个对Github上面编程语言使用统计的排行榜,JavaScript真可以说是一枝独秀,很难想象20年前,这个语言只是浏览器中的装饰性语言,能做的事情也就是一点特效或者检查一下要提交给服务器的表单是否满足要求。今天的JavaScript已经是一个全栈语言,从客户端到服务器无所不在。很多编程......
  • javainteger类-偷偷藏不住的想带大家领悟int 和 Integer 的区别
    其实在Java编程中,int和Integer都是非常常用的数据类型,但它们之间存在一些关键的区别,特别是在面向对象编程中。所以接下来,就让我们一起来探讨下关于int和Integer的区别这个问题吧。1.int和Integer的定义int是Java中的一种基本数据类型,用于表示整数。它是Java语言中最常用的数据类型......