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

news2024/10/6 6:02:17

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

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

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

在这里插入图片描述

以下正文开始

文章目录

  • Java中的异常分类
  • 如何处理异常
  • try...catch...finally
  • try-with-resources
  • throw关键字处理异常
  • throws关键字处理异常
  • throw关键字和throws关键字区别
  • 图书推荐

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年图灵奖得主作品。本书是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”的最新版本。自本书出版以来,被世界各地的著名高等院校和研究机构(包括美国哥伦比亚大学、斯坦福大学、哈佛大学、普林斯顿大学、贝尔实验室)作为本科生和研究生的编译原理课程的教材。该书对我国计算机教育领域也具有重大影响。

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lua编程——air724二次开发之点亮led教程

一.硬件 硬件型号:银尔达 Core-Air724模块; 杜邦线若干; micro Usb线; USB转TTL工具; 杜邦线用于电源(12V/1A)和TTL信号连接,micro Usb用于下载和调试。 硬件资源,如下图: 二.软件 u…

❤️最详细的Python学习路线-图文不废话

当谈论学习Python编程时,有许多不同的途径和资源可供选择。为了帮助你建立起一个学习Python的有效路线,下面是一个包含基本步骤和关键资源的建议。请注意,这只是一个指南,你可以根据自己的兴趣和学习风格进行调整。 ❝ 以下时间不…

推荐对象转换解决方案:MapStruct

1、什么是MapStruct 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感,却又不得不存在。我后来想的一个办法就是通过反射&a…

Django新手必看:从入门到精通Web应用开发①【文末送书三本】

Django新手必看:从入门到精通Web应用开发① 1. Django是什么1.2 Django的由来1.3 Django的命名1.4 Django的版本发布1.5 Django框架的特点 2 Django的设计模式2.1 MVC设计模式2.2 MTV设计模式 3 Django安装与配置3.1 Python支持版本:3.2 Django 3.2与4.1…

Filter设计模式,责任链模式一如既往的妙

场景1: 每种Filter进行某种处理,将各个Filter连在一起形成一个FilterChain。当需要往FilterChain中加入新的Filter,或者改变各个Filter的处理顺序时,可以方便的扩展。 1个接口: public interface Filter {public Str…

前端技术搭建拼图小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了俄罗斯方块游戏,今天还是继续按照我们原定的节奏来带领大家完成一个拼图游戏,功能也比较简单简单&#xff…

chatgpt赋能python:Python数组:如何使用Python将数据存入数组中

Python数组:如何使用Python将数据存入数组中 Python是一个非常强大的高级编程语言,在人工智能、数据科学和机器学习等领域有广泛应用。Python允许将数据存储在不同的数据结构中,其中,数组是最常用的。 在这篇文章中,…

卡尔曼滤波与组合导航原理(一)滤波的基本概念、递推最小二乘

文章目录 一、滤波的基本概念1、传统数字滤波器2、现代控制中的状态观测器3、最优估计的含义4、温度估计的例子1.问题描述2.分析 二、递推最小二乘 课程链接:https://www.bilibili.com/video/BV11K411J7gp/?p1 参考书目:《捷联惯导算法与组合导航原理》…

微信小程序nodejs+vue+uniapp大学体育场馆场地预约系统

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 本文以nodejs为开发技术,一开始,本文就对系统内谈到的基本知识,从整体上进行了描述&#xff0c…

人事管理项目-部门数据删除

人事管理项目-部门数据删除 后端实现前端实现 Spring Boot是一个框架,一种全新的编程规范,它的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且烦琐的配置文件,所以Spring Boot是一个服务于框架的框架&…

Netty之Channel解读

目录 channel 的主要作用 ChannelFuture CloseFuture 为什么要异步关闭 channel 的主要作用 close() 可以用来关闭 channelcloseFuture() 用来处理 channel 的关闭 sync 方法作用是同步等待 channel 关闭而 addListener 方法是异步等待 channel 关闭pipeline() 方法添加处理…

使用CodeAnt查找并修复IDE中的开源漏洞与许可证合规问题

不断加快的开发步伐正在将软件安全的责任转移到开发人员的桌面上,但是处理在下游构建和测试中检测到的安全问题可能是非常具有破坏性的。直至报告漏洞的时候,开发人员已经转移到他们的下一个任务。为了修复问题,他们必须中断正在做的事情&…

【OpenAI】Python:基于 Gym-CarRacing 的自动驾驶项目(4) | 车辆控制功能的实现

猛戳!跟哥们一起玩蛇啊 👉 《一起玩蛇》🐍 ​ 💭 写在前面:本篇是关于多伦多大学自动驾驶专业项目的博客。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物…

Faiss PQ 乘积量化

Approximate Nearest Neighbor搜索简称ANN。 从宏观上看ANN brute-force搜索的方式是在全空间进行搜索,为了加快查找的速度,几乎所有的ANN方法都是通过对全空间分割,将其分割成很多小的子空间,在搜索的时候,通过某种…

爬虫分布式爬虫部署知识详解

分布式爬虫是指将一个爬虫任务分解成多个子任务,由多个爬虫节点同时执行,以提高爬取效率和速度的一种爬虫方式。下面是分布式爬虫部署的详细步骤: 确定爬虫任务:首先需要确定要爬取的网站和数据,以及需要爬取的频率和深…

公牛33W车充评测 | 拓尔微 IM2403+TMI3451快充方案实力在线

本期嘉宾是我们的老熟人 公牛PD 33W的车载充电器,此前我们对其进行过拆解,那它的充电表现和各方面性能到底如何呢? 下面我们将围绕协议测试、供电方案和产品测试展开评测解读,帮助小伙伴们全方位了解这款1A1C双口快充车充及相应的…

maven私服搭建详细教程(看完必会)

目录 1 为什么需要私服 2 Nexus私服 2.1 Nexus下载及登录 2.2 maven仓库 2.2.1 代理仓库 2.2.2 宿主仓库 2.2.3 仓库组 3 本地Maven下载构建 3.1 pom.xml方式 3.2 镜像方式 4 本地依赖发布到私服 4.1 maven部署到nexus私服 4.1.1 快照版本 ​4.1.2 release版本 4.2 …

Jar包下载失败的解决方案

Jar包下载失败的解决方案 🔎配置阿里源🔎重新下载Jar包🔎结尾 🔎配置阿里源 点击 Settings 搜索 Maven 进行如下修改 注意🍭 User settings file 路径与 Local repository 路径中应尽量避免出现中文 搜索 User setti…

如何提高高层住宅的消防安全性?安科瑞 许敏

1高层住宅消防安全隐患特点 根据我国对高层住宅的规定,建筑高度大于54m的住宅建筑(包括设置商业服务网点的住宅建筑)为一类高层住宅建筑,建筑高度大于27m,但不大于54m的住宅建筑(包括设置商业服务网点的住宅…

JAVA代码程序如何调用电商API,获取电商数据?

电商API是为了实现各个电商平台之间数据交换而提供的网络接口。Java是一种流行的编程语言,可以通过调用API来获得电商平台提供的各种服务,如商品列表、订单状态等。在这篇文章中,我们将详细介绍如何使用Java代码调用电商API。 1.寻找电商平台…