如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

这篇具有很好参考价值的文章主要介绍了如何在项目中优雅的抛出异常,这些知识佬们还记得嘛。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:
本篇文章主要讲解Java中的几种异常关键字和异常类相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

以下正文开始

Java中的异常分类

Java中的异常机制是一种用于处理程序运行时错误和异常情况的机制。当程序运行时出现问题,如无法找到文件或网络连接失败等,就会抛出异常。这个过程称为“抛出异常”。

在Java中,所有的异常都是派生自java.lang.Throwable类。Throwable类有两个直接的子类:Exception和Error。Exception表示可处理的异常,而Error表示不可处理的异常。

首先详细介绍下Error:

错误(Error):是一些无法恢复或不可处理的错误,通常是由 JVM 或底层操作系统引起的,比如 OutOfMemoryError、StackOverflowError 等。错误无法被捕获和处理,只能通过修改程序代码或增加硬件资源等手段来避免。
而对于Exception异常类,有以下两种类型:

受检查异常/编译时异常(Checked Exception):也称为已检查异常,这些异常在编译时就必须进行处理,否则会导致编译错误。通常是由外部不可控的因素引起的,比如输入/输出错误、网络异常、数据库访问异常等。受检查异常包括 IOException、SQLException 等。

运行时异常(Runtime Exception):也称为未检查异常,这些异常在编译时不要求必须进行处理,程序员可以选择处理或不处理。通常是由程序中的逻辑错误引起的,比如空指针引用、下标越界、算术异常等。运行时异常包括 NullPointerException、IndexOutOfBoundsException、ArithmeticException 等。

如何处理异常

上面讲述了异常的分类,那么我们如何处理异常呢?

这里先给出答案,我们可以通过一些关键字或者代码块处理异常,接下来将详细介绍下几种方式。

try…catch…finally

Java 异常机制基于三个关键字:try、catch 和 finally。我们开发者可以将可能抛出异常的代码放在 try 语句块中,在 catch 块中捕获并处理这些异常,也可以使用 finally 块在任何情况下都执行必要的清理工作

其结构如下所示:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e) {
    // 处理 ExceptionType1 类型异常
} catch (ExceptionType2 e) {
    // 处理 ExceptionType2 类型异常
} finally {
    // finally 块中的代码始终都会被执行
}

在上面的代码中,我们使用 try-catch 来捕获可能抛出的受检查异常和运行时异常,对于必须关闭的资源,我们通常会在 finally 块中进行关闭。

无论 try 块中是否发生异常,finally 块中的代码都会被执行。finally 块通常用于释放资源、清理工作等操作,比如关闭文件句柄、释放内存等。即使在 try 或 catch 块中有 return 语句,finally 块也会在这些语句之后执行。

需要注意的是,finally 块不一定要和 catch 块一起使用,也可以单独出现。此外,在 Java 7 中,还引入了一个新的关键字 try-with-resources,用于自动释放资源的处理方式,可以进一步简化代码。
如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

try-with-resources

try-with-resources是Java 7引入的一种新的异常处理机制,主要用于处理需要关闭资源的情况。在这种机制下,我们可以通过try块中声明资源对象的方式,自动管理这些资源对象的释放和关闭。

使用try-with-resources机制的代码结构如下:

try (ResourceType resourceVar1 = ResourceInitialization1;
     ResourceType resourceVar2 = ResourceInitialization2;
     ...) {
    // Code that uses the resourceVar1 and/or resourceVar2.
} catch (ExceptionType e) {
    // Exception handling code.
}

在这里,ResourceType是需要关闭的资源类型,resourceVar是资源变量名,ResourceInitialization是一个表达式,用来初始化资源。多个资源之间用分号分隔。在try块结束后,程序会自动调用资源的close方法,从而释放资源。

try-with-resources机制使得资源管理变得更加简单、可读性更强,并且减少了忘记释放资源的可能性。此外,此机制还支持对异常处理的自动化控制,可以简化代码的结构和调试过程。

当然,这里也有我们需要注意的点,只有实现了AutoCloseable接口的资源对象才能够在try-with-resources机制下使用。如果资源对象未实现AutoCloseable接口,则需要使用上面介绍的传统的try-catch-finally语句块来手动释放资源。

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

throw关键字处理异常

在处理异常时,throw关键字用于手动抛出异常。使用 throw 语句时,在代码块中会创建一个指定异常类的对象,该对象包含有关异常类型和异常信息的详细信息,并将其传递给调用者。

throw 语法如下所示:

throw exceptionObject;

其中,exceptionObject 表示要抛出的异常对象。exceptionObject 必须是 throwable 类或其子类的一个实例。

通常情况下,在某些条件不满足时需要抛出异常,而这种情况违反了当前环境和程序逻辑的约束。由于异常的提出与处理可能更加容易,因此认为抛出异常是一种更好的解决方案。

我们以一个简单的示例,说明如何使用 throw 语句来显式抛出一个异常:

public class Example {
    public static void main(String[] args) {
        try {
            int a=10, b=0;
            if(b==0)
                throw new ArithmeticException("除数为0");
            else
                System.out.println(a/b);
        } catch (ArithmeticException e) {
            System.out.println(e.getMessage());
        }
    }
}

在这个例子中,当被除数值等于零时,它将执行 throw 语句向次级方法抛出 ArithmeticException 异常。如果没有抛出异常,将在 console 中打印结果。

最后需要注意的是,当代码遇到 throw 语句时,它将立即停止当前代码块的执行,并将控制权传递到异常处理程序中。如果没有定义错误处理程序,则会引发运行时错误并终止程序的执行。因此,在使用 throw 语句之前,需要确保适当地处理异常。
如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

throws关键字处理异常

在使用throws关键字处理异常,throws关键字用于告诉编译器一个方法可能会抛出哪些类型的异常这个关键字通常用在方法的声明中,并且可以跟一个或多个异常类名

方法声明示例:

public void readFile() throws IOException {
    // code that reads file.
}

在上面的代码中,readFile()方法可能会抛出IOException异常,因此使用了throws关键字来声明。这意味着在调用该方法时,调用者必须处理或重新抛出IOException异常。

当有多个异常可能会被抛出时,可以使用逗号分隔它们:

public void connectToServer() throws IOException, InterruptedException {
    // code that connects to server.
}

如果一个方法没有通过throws关键字声明可能会抛出的异常,而在方法内部又抛出了异常,那么编译器将会提示一个编译错误。

使用throws关键字,可以使得我们更好地组织自己的代码,并且提高代码的可读性和可维护性。调用者可以根据方法声明中列出的异常类型,进行更加精准的异常处理。同时,使用throws关键字也要求方法实现者更加注意异常处理,并且编写更加健壮的代码。

throw关键字和throws关键字区别

上面我们介绍了throw和throws关键字来处理异常,相信火眼金睛的大佬可能已经看出了两者的区别,在这里再总结一下:

  • throw 关键字:
    throw 是一个操作符,用于手动抛出一个异常对象
    通常情况下,在某些条件不满足时需要抛出异常,违反了当前环境和程序逻辑的约束。使用 throw 能够显式地抛出一个异常,使错误信息更加清晰明确。

  • throws 关键字:
    throws 关键字用于方法签名中,用于声明给调用者该方法可能会抛出的异常类型方便捕获处理或者继续向外抛出(由上层处理)。
    如果一个方法可能会抛出异常,就可以使用 throws 在方法声明中指定该异常。这样做是为了让调用该方法的代码知道处理这个异常,或者依次传递给其上层方法来处理。

throws 可以声明多个异常,例如: public void testMethod() throws Exception1, Exception2 {...}
上述两个关键字的区别在于,throw 是用于手动抛出异常,而 throws 是在方法签名中声明该方法有可能会抛出的异常并把异常交给其他方法进行处理。

使用 throw 抛出异常时,要么在方法内部 try…catch 捕获并处理,要么通过 throws 在方法签名中声明可能抛出的异常类型。

图书推荐

本期推荐书籍书单如下:
如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。卡内基-梅隆大学、北京大学、上海交大等国内外众多知名高校选用指定教材。

本书的最大优点是为程序员描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为,以及造成效率低下的原因。

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛
影响全球千万程序员的“算法圣经”!MIT四大名师联手铸就,将严谨性和全面性融为一体深入讨论各类算法。

麻省理工学院、卡内基梅隆大学、斯坦福大学、加州大学伯克利分校、康奈尔大学、伊利诺伊大学厄巴纳-香槟分校等国内外千余所高校采用教材!

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

数据库领域的殿堂级作品,历经十年全面更新第七版!

夯实数据库理论基础,修炼数据库技术内功的必备之选!对深入理解数据库,深入研究数据库,深入操作数据库都具有在这里插入图片描述
极强的指导作用!

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛
2020年图灵奖得主作品。本书是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”的最新版本。自本书出版以来,被世界各地的著名高等院校和研究机构(包括美国哥伦比亚大学、斯坦福大学、哈佛大学、普林斯顿大学、贝尔实验室)作为本科生和研究生的编译原理课程的教材。该书对我国计算机教育领域也具有重大影响。

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛文章来源地址https://www.toymoban.com/news/detail-477698.html

到了这里,关于如何在项目中优雅的抛出异常,这些知识佬们还记得嘛的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

    Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64 博主在打包的过程中,“屡次接收到”报错啦 ❗ ” “打包了没❗”“打好了没❗”,我可以很肯定地告诉你: ,作为一个打包仔而言,老老实实解决bug解决问题比较重要, 可能是项目中

    2024年02月09日
    浏览(84)
  • 【测试联调】如何在前后端测试联调时优雅的构造异常场景

    目录 背景 使用iptables实现 利用iptables丢弃某ip数据包 使用 -L 列出所有规则 IP 连通性 通信 测试 插入一条规则,丢弃此ip 的所有协议请求 列出所有规则 测试 丢弃规则内的IP 连通性 清除 规则列表的 限制 模拟ip进行丢包50%的处理。 mysql proxy 代理 proxy代码 直接使用pymysql 测试

    2024年02月14日
    浏览(39)
  • 【C++】抛出异常

    try  throw catch         与return相似,return是正常的返回,throw是异常的返回。 1.设计自己的异常类型 2.通过if语句判断--throw 抛出异常 3.try调用有throw的函数,catch(指定的错误类型 e)捕获异常对象 throw抛出异常,catch捕获异常,其中catch捕获与()内类型匹配的异常。 catch(...)可

    2024年02月05日
    浏览(37)
  • 啪,还敢抛出异常

    去年又重新刷了路遥的《平凡的世界》,最近也在朋友推荐下,来看了路遥的另一部成名作《人生》。 故事中的主人公高加林,虽生在农村,面朝黄土背朝天,却不甘心像父辈一样或者,一心想着摆脱民语的束缚,追求他的理想生活。 然而命运多舛,在他所想象的理想生活

    2024年03月25日
    浏览(51)
  • 抛出异常时将异常信息返给前端

      全局异常处理器负责将抛出的异常,以统一的格式返给前端。在这里起主要作用的注解是@RestControllerAdvice。 @RestControllerAdvice主要配合@ExceptionHandler使用,统一处理异常情况。 1、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@Requ

    2024年02月16日
    浏览(47)
  • Java异常处理--throw手动抛出异常对象

    之前说的几个步骤: ①此时执行几行代码,在执行的过程中,可能出现一些问题,比如将字符串“abc”转换成Integer类型的,肯定是没有办法转化。这时候它会在相应代码位置自动生成一个 NumberFormatException 的对象,这个对象就被抛出去了。 ②针对抛出的异常对象,考虑catc

    2024年01月19日
    浏览(44)
  • python中自定义异常/raise关键字抛出异常

    在编程过程中合理的使用异常可以使得程序正常的执行。有直接抛出异常的形式,也能通过捕获异常加入异常时的业务逻辑处理。 创建自定义异常类案例 使用raise抛出异常案例 raise抛出异常主要是为了在特定的条件。 在调用throw_exception函数后,传入值为10时则抛

    2024年02月03日
    浏览(57)
  • 【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

    异常是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ; 当程序执行错误时 , 由 throw 抛出异常 , 并即跳转到相应的异常处理程序中 ; 如果没有适当的异常处理程序处理该异常 , 程序会崩溃终止 ; 异常与函数对比 : 函数 是一种 以 栈结构 展开的

    2024年02月04日
    浏览(49)
  • java抛出异常后,后续代码是否继续执行

            java 抛出异常后,后面的语句到底是怎么执行的呢?哪些会继续执行,哪些不再执行,这是本章要探讨的问题。为方便广大友友解决问题,先把结论丢出来: 1、有 try-catch 语句块,并且 throw 在 catch 语句块里,那么 try 语句块中引发异常(报错)的那一行代码的后

    2024年02月16日
    浏览(36)
  • List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常

    1.应用场景,今天生产日志监控到一组new ArrayList() 进行add 异常,具体日志如下: 具体代码: 上面代码是对ids 分片按照10条记录查询远程接口,并将结果集放到list riskSummaryList 对象中 riskSummaryList.add(new DTO() )最后输出结果,代码比较简单. 分析:这种情况属于多线程并发产生的

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包