异常处理错误

news/2025/2/7 7:27:06/

目录

1.异常的概念

2.异常的结构

3.异常的分类

3.1 受检查异常(Checked Exception)

3.2 运行时异常(RunTime Exception)

4.捕获异常

4.1 try块

4.2 catch捕获

5. 创建自定义异常

6. finally

7. 一些注意点


1.异常的概念

        异常是在程序运行时发生的一些意外情况,如硬件故障、输入错误、网络连接中断等,这些情况都会导致程序无法按照正常流程执行下去。当程序遇到异常情况时,会抛出一个异常对象,该异常对象描述了异常情况的类型和详细信息。通常情况下,程序会停止执行当前任务,并尝试捕获并处理异常,以确保程序能够正常运行。

        异常处理是一种编程技术,用于在程序运行时检测和处理异常情况。它包括捕获异常、处理异常、记录异常信息、重新抛出异常等步骤。通过使用异常处理技术,可以使程序更加健壮和可靠,提高程序的容错能力。

2.异常的结构

  • Throwable是异常体系的顶层类,其派生出两个重要的子类, Error Exception
  • Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等
  • Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。我们平时所说的异常就是Exception。其下面有许多的子类异常,例如:受检查异常(Checked Exception),运行时异常(RunTimeException),这些异常也是最主要介绍的异常。

3.异常的分类

3.1 受检查异常(Checked Exception)

        这种异常发生在编译阶段,所以也叫做编译异常,这种异常编译器会进行提醒。

        受检查异常通常是由于外部环境的因素所导致的,例如文件操作中遇到的I/O错误、数据库操作中遇到的连接中断等等。对于这些异常,程序员需要决定如何处理它们,通常可以选择进行异常处理、重试操作或者向用户报告错误信息。如果不对受检查异常进行处理,程序将无法通过编译。

3.2 运行时异常(RunTime Exception)

        在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception) 。

        运行异常分为:数组越界(ArrayIndexOutOfBoundsException),空指针引用(NullPionterException),类型转换,算术操作溢出(ArithmeticException)等。

4.捕获异常

4.1 try块

try{//Code that might generate exceptions
}

        如果方法中产生了异常,那么这个方法将抛出异常结束。而在try关键字后的普通代码块中编写可能产生异常的代码块,这个块将“尝试”各种可能产生异常的方法的调用,这样当抛出异常的时候将不会立即结束。

4.2 catch捕获

try{//Code that might generate exceptions
} catch(Type1 e1){//handle exception of Type1
} catch(Type2 e2){//handle exception of Type2
}//etc...
try块中产生的异常将被相对应的第一个catch子句(异常处理程序)捕获,然后执行catch子句中的语句,当catch子句执行结束,则处理程序的查找过程结束。

5. 创建自定义异常

        虽然Java中提供有很多异常,但是并不能包括所有的异常,所以我们可以自己定义异常。

         建立新的异常,必须继承已有的异常类继承,最好选择相似的异常类继承。

代码如下:

//Creating your own exceptions.
public class MyException extends RuntimeException{public MyException() {super();}public MyException(String message) {super(message);}
}
public class TestException {public static void main(String[] args) {try{f();}catch (MyException e){e.printStackTrace();}try{g();}catch(MyException e){e.printStackTrace();}}private static void f() throws MyException{System.out.println("Throwing MyException from f()");throw new MyException();}private static void g() throws MyException{System.out.println("Throwing MyException from g()");throw new MyException("originated in g()");}
}
/*OutPut:
Throwing MyException from f()
MyExceptionat TestException.f(TestException.java:25)at TestException.main(TestException.java:12)
Throwing MyException from g()
MyException: originated in g()at TestException.g(TestException.java:30)at TestException.main(TestException.java:17)*/

6. finally

        有一些代码,无论try块中的异常是否抛出 ,都希望它可以执行。所以引用了finally子句,无论异常是否抛出,finally子句总能被执行

        对于没有垃圾回收和析构函数自动调用的机制的语言来说,finally非常重要。它可以使不论try语句中发生了什么,内存总能释放。但Java中有垃圾回收机制,finally有什么作用呢?答:它可以使内存之外的资源恢复到初始状态。

格式:

try{//Code that might generate exceptions//that might throw A,B,or C
} catch(Type1 A){//handle exception of Type1
} catch(Type2 B){//handle exception of Type2
} catch(Type3 C){//handle exception of Type3
} finally{//Activities that happen every time
}

验证finally子句是否执行,只需将5.代码加上下列代码,就可验证有异常抛出:

finally{System.out.println("finally");}
/*OutPut
finally
*/

无异常抛出:

    public static void main(String[] args) {try{System.out.println("Normal");}catch(RuntimeException e){e.printStackTrace();}finally{System.out.println("finally");}}
/*OutPut
Normal
finally
*/

7. 一些注意点​​​​​​​

  • .throw必须写在方法体内部
  • 抛出的对象必须是Exception 或者 Exception 的子类对象
  • 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
  • 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
  • throws 必须跟在方法的参数列表之后
  • 声明的异常必须是 Exception 或者 Exception 的子类
  • 方法内部如果抛出了多个异常, throws 之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型具有父子关系,直接声明父类即可


http://www.ppmy.cn/news/76905.html

相关文章

Tensorflow2基础代码实战系列之双层RNN文本分类任务

深度学习框架Tensorflow2系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark …

安捷伦DSO80404B(Agilent)dso80404b租售回收 数字示波器

DSO80404B 是 Agilent 的 4 GHz、4 通道数字示波器。测量电子电路或组件中随时间变化的电压或电流信号,以显示振幅、频率和上升时间等。应用包括故障排除、生产测试和设计。 附加功能: 4 GHz 带宽,可升级至 13 GHz 4个模拟通道 高达 40 G…

Java基础 变量与数据类型(类型转换)

变量 为什么需要变量 一花一世界,如果把一个程序看做一个世界或一个社会的话,那么变量就是程 序世界的花花草草、万事万物。即,变量是程序中不可或缺的组成单位,最基 本的存储单元。 初识变量 变量的概念 内存中的一个存储区域…

宝塔面板搭建Discuz论坛并发布互联网访问【无需云服务器】

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 转载自cpolar极点云的文章:Linux宝塔面板搭建Discuz论坛,并公网远程访问【内网穿透】 前言 Crossday Discuz! Board(以…

JavaScript实现输入数值判断是否为质数、合数的代码

以下为实现输入数值判断是否为质数、合数的程序代码和运行截图 目录 前言 一、输入数值判断是否为质数、合数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找; 2.本博文代码可…

“五一”假期出行,伴随着哪些风险

2023年“五一”假期,文化和旅游行业复苏势头强劲,全国假日市场平稳有序。文化和旅游部数据中心测算,全国国内旅游出游合计2.74亿人次。 据交通部门数据显示,自4月27日铁路“五一”假期运输启动以来,截至5月4日&#x…

Golang当中的定时器

定时器 前言定时器的基本使用 前言 在平时写代码的时候,我们经常会遇到在将来某个时间点或者间隔一段时间重复执行函数。这个时候我们就可以考虑使用定时器。本片文章主要介绍一下golang当中的几个常用的定时器。time.Timer,time.Ticker,time.After以及time.AfterF…

Spring 统一功能处理(拦截器)

文章目录 Spring拦截器1.统一用户登录权限校验1) SpringAOP 用户统一验证的问题2) Spring拦截器3) 拦截器实现原理4)同一访问前缀添加 2. 统一异常处理3. 统一数据返回格式1)统一数据返回的好处2)统一数据返回实现 Spring拦截器 SpringBoot统…