Java基础之异常处理

Java基础之异常处理

  • 一、Java异常处理
  • 二、捕捉异常
  • 三、常见异常
  • 四、自定义异常
    • 4.1、throw关键字
      • 注意事项:
    • 4.2、throws关键字
      • 关键点:
      • 注意事项:
    • 4.3、throw和throws的区别:

一、Java异常处理

异常机制可以使程序中的异常处理代码和正常业务代码分离。在程序设计和运行的过程中,发生错误是不可避免的。为此Java提供了异常的处理机制,来帮助程序员检查可能出现的错误。保证程序的可读性和可维护性。Java将异常封装到一个类中,出现错误时就会抛出异常,程序终止。


Error错误:一般是指与虚拟机相关的问题,如系统崩溃、JVM系统内部资源耗尽、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。比如:StackOverflowError(栈溢出)和OOM(内存溢出)

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:

  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断
  • 数组角标越界

Error和Exception都有一个共同的根类是Throwable类,下表为常用的异常分类。

在这里插入图片描述

​ 为了保证程序能正常的运行,我们需要对出现的异常错误进行及时的处理。在Java 的异常处理机制当中,当某个方法出现异常时,可以在该方法里进行捕捉,然后处理异常,也可以将异常向上抛出,交给该方法的调用者处理。

二、捕捉异常

Java语言的异常捕捉结构为:

try{// 可能产生异常错误的代码块
}catchExceptionTypeOne  e){// 对异常 ExceptionTypeOne 的处理语句
}catch ( ExceptionTypeTwo e) {// 对ExceptionTypeTwo 的处理语句
}
...
finally {     // 无论成功与否都会执行的代码块,一般用于关流// 资源回收语句块
}

语法解释:

①try语句是可能发生异常的部分

②catch用来捕捉异常代码,{}中为异常处理的语句。

​ getMessage() 获取异常信息,返回字符串。
​ printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。

​ toString()给出异常的性质和类型

③finally为异常处理的最后一步,catch未被捕捉,finally也一定会执行。

​ 主要做一些清理工作,如流的关闭,数据库连接的关闭等。

三、常见异常

Java常见异常如下表所示:

异常类说明
受检查异常(Checked Exception)受检异常是在编译时由编译器检查并强制要求程序员处理的异常
IOException输入/输出异常,包括文件读写错误
SQLException数据库访问异常
FileNotFoundException尝试访问不存在的文件
ParseException字符串解析异常,通常与日期和时间相关
非受检异常(Unchecked Exception)非受检异常是在运行时发生的异常,通常是由于程序逻辑错误或其他不可预测的因素引起的
NullPointerException尝试访问空对象引用
ArrayIndexOutBoundsException数组索引越界
ArithmeticException算术运算异常,如除以零
ClassCastException类型转换异常
lllegalArgumentException非法参数异常
lllegalStateException程序或环境处于不适当状态异常

四、自定义异常

自定义异常是指根据程序的需求和特定情境,程序员自己定义的异常类。这些异常类通常是通过继承 Java 中的异常类(通常是 Exception 或其子类)来创建的,以便提供更具体和可读性强的异常信息。

自定义异常类的结构如下:

public class CustomException extends Exception {// 构造方法public CustomException() {super();}public CustomException(String message) {super(message);}public CustomException(String message, Throwable cause) {super(message, cause);}// 可以添加自定义的方法或属性
}

上述代码中,CustomException 继承了 Exception 类,提供了几个构造方法,其中包含了不同的参数组合。这样的设计使得我们在抛出自定义异常时能够提供详细的异常信息,并且可以选择将原始异常(cause)连接到新的异常对象中,形成异常链。

代码示例:

public class CustomValidationException extends Exception {private String fieldName;public CustomValidationException(String fieldName, String message) {super(message);this.fieldName = fieldName;}public String getFieldName() {return fieldName;}
}
//这个自定义异常用于表示验证失败的情况,其中包含了字段名称和相应的错误信息。

4.1、throw关键字

  1. 抛出特定异常

    throw new SomeException("This is a custom exception message");
    

    SomeException 是一个自定义异常类,通过 throw 关键字创建了该异常的一个实例,并传递了一个描述性的错误消息。

  2. 方法声明抛出异常

    在方法的声明中,你可以使用 throws 关键字指定该方法可能抛出的异常类型。然后,在方法的实现中,你可以使用 throw 关键字抛出这些异常。

    public void someMethod() throws SomeException {// some codeif (errorCondition) {throw new SomeException("Error message");}// more code
    }

    在这个例子中,someMethod 方法声明可能抛出 SomeException 异常。在方法的实现中,如果满足某些条件,就会使用 throw 抛出该异常。

  3. 抛出现有异常

    你也可以使用 throw 关键字重新抛出当前上下文中已捕获的异常。这通常发生在 catch 块中,当你希望在捕获异常后将其传递给上层调用者时使用。

    try {// some code that may throw an exception
    } catch (SomeException e) {// handle the exceptionthrow e; // rethrow the exception
    }
    

注意事项:

​ 此外,throw必须写在方法体内部 ,抛出的对象必须是Exception 或者 Exception 的子类对象。如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理 如果抛出的是编译时异常,用户必须处理,否则无法通过编译 。异常一旦抛出,其后的代码就不会执行

4.2、throws关键字

​ 在Java中,throws 是一个关键字,用于在方法签名中声明可能抛出的异常。当一个方法可能抛出某种类型的异常时,你可以使用 throws 关键字将这些异常列在方法的声明中,以告知调用方可能需要处理这些异常。

语法格式如下:

[(修饰符)]  (返回类型)  (方法名) ([参数列表]) [throws(异常类)]{...}public void doA(int a) throws Exception1,Exception3{......}void methodName() throws SomeException, AnotherException {// method implementation
}

在这个例子中,methodName 方法声明可能抛出 SomeExceptionAnotherException 这两种异常。调用方在调用这个方法时,必须要么处理这些异常,要么再次使用 throws 将这些异常传递给更高层次的调用。

关键点:

  • 多个异常类型: 你可以在 throws 子句中列出多个异常类型,用逗号分隔。

    void myMethod() throws IOException, SQLException {// method implementation
    }
    
  • 派生异常: 如果方法可能抛出某个异常的子类,你可以只声明父类异常,而不需要显式地声明所有可能的子类异常。

    void myMethod() throws IOException {// method implementation
    }
    
  • RuntimeException: 对于运行时异常(RuntimeException)及其子类,你通常不需要在方法签名中使用 throws 关键字声明,因为它们是不受检查的异常,编译器不会强制你在调用这些方法时进行异常处理

注意事项:

  • throws必须跟在方法的参数列表之后
  • 声明的异常必须是 Exception 或者 Exception 的子类

4.3、throw和throws的区别:

throwthrows
语句抛出一个异常方法可能抛出异常的声明。
用在方法体内,抛出的异常由方法体内的语句处理;方法函数头,抛出的异常由方法的调用者处理。
具体向外跑出的异常,是抛出来的一个异常实例声明这个方法会抛出这个类型的异常,调用者知道要捕获这个异常

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC|LangChain新手入门指南,5分钟速读版!

如果你用大语言模型来构建AI应用,那你一定不可能绕过LangChain,LangChain是现在最热门的AI应用框架之一,去年年底才刚刚发布,它在github上已经有了4.6万颗星的点赞了,在github社区上,每天都有众多大佬,用它…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑氢储一体化协同的综合能源系统低碳优化》

这个标题涉及到考虑了多个方面的能源系统优化,其中关键的关键词包括"氢储一体化"、"协同"、"综合能源系统"和"低碳优化"。以下是对这些关键词的解读: 氢储一体化: 氢储存: 指的是氢气的存…

西门子PLC与组态王无线通讯中如何设置从站

本方案主要详述了在多台西门子300PLC与组态王之间Modbus无线通讯中如何设置从站。方案中所用到的无线通讯终端是DTD434MC——欧美系PLC专用无线通讯终端。 一、方案概述 无线Modbus网络组成如下: 二、测试背景 ● PC端组态软件版本:组态王6.55 ● 默…

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字: raster、point、PostGIS、等值线 环境准备 Postgresql版本:PostgreSQL 14.0, 64-bitPostGIS版本:POSTGIS"3.3.2"QGIS版本:3.28.3-Firenze(验证用&…

express习惯养成小程序-计算机毕设 附源码 32209

习惯养成小程序的设计与实现 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,习惯养成小程序被用户普遍使…

全程云OA SQL注入漏洞复现

0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能,超过100多个子模块。为企业内部提供高效、畅通的信息渠道,同时也能大力推动公司信息系统发展,提高企业的办公自动化程度和综合…

声音响度、声压级计权(A B C)实现

声压 sound pressure 声压就是大气压受到声波扰动后产生的变化,即为大气压强的余压,它相当于在大气压强上的叠加一个声波扰动引起的压强变化。由于声压的测量比较容易实现,通过声压的测量也可以间接求得质点速度等其它物理量,所以…

C语言WFC绘制矩形

代码实现: void CCGDrawingView::Rectangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, COLORREF color,CDC* pDC) {CPen redPen(PS_SOLID, 1, color);CBrush redBursh(color);CPen* pOldPen pDC->SelectObject(&redPen);CBrush* p…

【运营思维】美团面试题:如何把梳子卖给寺庙和尚?

Hello 小米的小伙伴们~ 欢迎来到小米的微信公众号!今天小米要和大家分享一道美团运营面试题,题目可真是独特——“如何把梳子卖给寺庙和尚?”想必大家一定兴奋不已吧! 首先,让我们理清思路,挑战这个看似不…

【阿里云】图像识别 智能分类识别 增加网络控制功能点(三)

一、增加网络控制功能 实现需求TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。 查看当前系统的TCP KeepAlive参数修改TCP KeepAlive参数 三、C语言实现TCP KeepAlive功能 四、setsockopt用于设置套接字选项的系…

Python实现定时任务的方案及其比较

目录 一、引言 二、基于time模块的定时任务 三、基于schedule库的定时任务 四、基于APScheduler库的定时任务 五、基于Celery库的定时任务 七、总结与比较 一、引言 在Python中,定时任务指的是在特定的时间间隔或者特定的时间点自动执行某些操作的任务。定时…

浅谈安科瑞ASJ继电器在马尔代夫环岛水上排屋的应用

摘要:对电气线路进行接地故障保护,方式接地故障电流引起的设备和电气火灾事故越来越成为日常所需。针对用户侧主要的用能节点,设计安装剩余电流继电器,实时监控各用能回路的剩余电流状态。通过实时监控用能以及相关电力参数、提高…