JAVA中try-catch结构之异常处理的使用方法

 更新时间:2024年09月01日 08:37:49   作者:非非从零学IT  
Java编程中一个非常重要且实用的概念,可以帮助我们处理代码运行时发生的异常情况,下面这篇文章主要给大家介绍了关于JAVA中try-catch结构之异常处理的使用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

try-catch 是 Java 和许多其他编程语言中用于异常处理的关键字组合,它允许程序员优雅地捕获和处理运行时可能出现的错误。以下是 try-catch 结构的详细说明:

结构:

try {
    // 有可能抛出异常的代码块
    // 这里可以调用方法、执行操作等
    riskyOperation();
} catch (SpecificExceptionType1 e) {
    // 处理 SpecificExceptionType1 类型异常的代码块
    // 可以访问到异常对象 e,通过 e.getMessage(), e.printStackTrace() 等方法获取异常信息
    System.out.println("Caught Exception Type 1: " + e.getMessage());
} catch (SpecificExceptionType2 e) {
    // 处理 SpecificExceptionType2 类型异常的代码块
    System.out.println("Caught Exception Type 2: " + e.getMessage());
} finally {
    // 无论是否发生异常,都会执行的代码块
    // 通常用于资源清理,如关闭文件、数据库连接等
    cleanupResources();
}

解释:

  • try 块:包裹可能会抛出异常的代码。当 try 块中的代码执行时,如果出现了异常(例如除数为零、文件未找到等),控制权将立即转到相应的 catch 块。

  • catch 块:每一个 catch 块都与一个或一类异常类型相关联。当 try 块中的代码抛出与 catch 块声明的异常类型相匹配的异常时,与之关联的 catch 块将被执行。在 catch 块中,可以访问到异常对象,进而获取异常的详细信息。

  • finally 块(可选):无论 try 块中是否抛出了异常,以及是否有与之匹配的 catch 块,finally 块中的代码总会被执行。通常用于资源回收、关闭打开的文件、数据库连接等操作,确保无论程序运行结果如何,都能正确释放资源。

示例:

try {
    int denominator = 0;
    int result = 10 / denominator; // 这将抛出 ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("Divide by zero error occurred: " + e.getMessage());
} finally {
    System.out.println("Finally block executed.");
}

在这个例子中,尝试除以零会抛出 ArithmeticException,这个异常会被相应的 catch 块捕获并处理,然后执行 finally 块中的代码。

多重捕捉:

在Java中,可以使用多重 catch 子句来捕获不同类型的异常。这样,可以根据异常的不同类型执行不同的处理逻辑。下面是一个使用多重 catch 的示例:

try {
    // 可能抛出多种类型异常的代码
    File file = new File("non_existent_file.txt");
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = br.readLine();
} catch (FileNotFoundException e) {
    // 处理找不到文件异常
    System.out.println("File not found: " + e.getMessage());
} catch (IOException e) {
    // 处理读取文件时发生的其他IO异常,如读取错误、缓冲区溢出等
    System.out.println("An IO error occurred: " + e.getMessage());
} finally {
    // 清理资源,如关闭文件流
    try {
        if (br != null) {
            br.close();
        }
    } catch (IOException ex) {
        System.out.println("Error closing the reader: " + ex.getMessage());
    }
}

在上述代码中,try 块中包含了可能导致 FileNotFoundException 和 IOException 的代码。当出现 FileNotFoundException 时,第一个 catch 子句会被执行;如果发生了 IOException 但不是 FileNotFoundException(例如读取过程中出现问题),则第二个 catch 子句会被执行。

需要注意的是,Java 7及更高版本引入了一种更简洁的异常处理方式,即使用一个多异常捕获的 catch 子句,可以捕获并处理多种类型的异常,如下所示:

catch (FileNotFoundException | IOException e) {
    System.out.println("An error occurred: " + e.getMessage());
}

这种方式可以合并处理同类或继承关系中的多种异常类型。但是,如果需要针对每种异常采取不同的处理措施,还是需要分开使用多个 catch 子句。

附:自定义异常

上面提到:如果抛出异常对象必须是异常类的子类(❌throw new String(”ssdf“)),但是现在想自定义一个怎么办呢?

1、为什么需要自定义异常类

Java中不同的异常类,分别表示着某一种具体的异常情况。那么在开发中总是有些异常情况是核心类库中没有定义好的,此时我们需要根据自己业务的异常情况来定义异常类。例如年龄负数问题,考试成绩负数问题,某员工已在团队中等。——可以通过异常名称就能直接判断此异常出现的原因,因此有必要不满指定条件时,通过此异常类判断出具体的异常问题

2、如何自定义异常类

  • 继承于现有的异常体系:java.lang.Exceptionjava.lang.RuntimeException
  • 通常提供几个重载的构造器:无参构造、(String message)构造器
  • 提供一个全局常量:声明为static final long serialVersionUID

3、如何使用自定义异常类

  • 在具体代码中,满足指定条件的情况下,只能手动使用"throw 自定义异常类的对象"方式,将异常对象抛出【生成异常对象,手动抛】
  • 如果是非运行时异常,必须要处理:try-catch、throws

自定义异常类,并手动抛出异常对象→处理异常

//自定义异常类
class MyException extends Exception {
    static final long serialVersionUID = 23423423435L;
    private int idnumber;
    public MyException(String message, int id) {
        super(message);
        this.idnumber = id;
    }
    public int getId() {
        return idnumber;
    }
}
public class MyExpTest {
    public void regist(int num) throws MyException {
        if (num < 0)
            throw new MyException("人数为负值,不合理", 3);//手动抛出异常对象
        else
            System.out.println("登记人数" + num);
    }
    public void manager() {
        try {
            regist(100);//执行会产生异常对象的代码,就需要进行异常处理
        } catch (MyException e) {
            System.out.print("登记失败,出错种类" + e.getId());
        }
        System.out.print("本次登记操作结束");
    }
    public static void main(String args[]) {
        MyExpTest t = new MyExpTest();
        t.manager();
    }
}

总结

到此这篇关于JAVA中try-catch结构之异常处理的使用方法的文章就介绍到这了,更多相关JAVA try-catch异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用雪花算法生成唯一ID的实现示例

    Java使用雪花算法生成唯一ID的实现示例

    雪花算法是 Twitter 开源的一种分布式ID生成算法,其目的是生成全局唯一的 ID,本文主要介绍了Java使用雪花算法生成唯一ID的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • SpringBoot接收LocalDateTime参数的方式

    SpringBoot接收LocalDateTime参数的方式

    这篇文章主要介绍了SpringBoot接收LocalDateTime参数的方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Spring中@Scope注解用法解析

    Spring中@Scope注解用法解析

    这篇文章主要介绍了Spring中@Scope注解用法解析,@Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作用域,需要的朋友可以参考下
    2023-11-11
  • springboot整合redis进行数据操作(推荐)

    springboot整合redis进行数据操作(推荐)

    springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作。下面通过本文给大家分享springboot整合redis进行数据操作的相关知识,感兴趣的朋友一起看看吧
    2017-10-10
  • 解决spirngboot连接redis报错:READONLY You can‘t write against a read only replica的问题

    解决spirngboot连接redis报错:READONLY You can‘t write against 

    docker部署的redis,springboot基本每天来连redis都报错:READONLY You can't write against a read only replica,重启redis后,可以正常连接。但是每天都重启redis,不现实,也很麻烦,今天给大家分享解决方式,感兴趣的朋友一起看看吧
    2023-06-06
  • Java开发SSM框架微信退款的实现

    Java开发SSM框架微信退款的实现

    这篇文章是Java微信退款的教程,退款之前用户需要先进行支付,支付之后才可以使用退款,非常具有实用价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • SpringBoot返回中文乱码问题解决方法汇总

    SpringBoot返回中文乱码问题解决方法汇总

    这几天在使用Spring Boot学习AOP原理的时候,通过浏览器访问后端接口的时候,响应报文总是出现中文乱码问题,下面这篇文章主要给大家介绍了关于SpringBoot返回中文乱码问题解决方法,需要的朋友可以参考下
    2023-06-06
  • java使用EasyExcel导入导出excel

    java使用EasyExcel导入导出excel

    导入导出excel数据是常见的需求,今天就来看一下Java基于EasyExcel实现这个功能,感兴趣的朋友可以了解下
    2021-05-05
  • java自带排序使用

    java自带排序使用

    这篇文章主要给大家分享了java自带排序使用,该方法是升序排序,方法的内部采用了快排实现,但该方法是 稳定的。下面一起来看看文章的详细介绍吧
    2021-12-12
  • SpringBoot文件上传功能的实现方法

    SpringBoot文件上传功能的实现方法

    这篇文章主要介绍了SpringBoot文件上传功能的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论