Java---异常概述

news2024/11/25 14:19:49

(一)认识Java的异常

1、什么是异常

      在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式问题,读取文件是否存在,网络是否始终保持通畅等等。

 

  • 异常 :指的是程序在执行过程中,出现的非正常的情况,如果不处理最终会导致JVM的非正常停止。

异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.

异常也不是指逻辑代码错误而没有得到想要的结果,例如:求a与b的和,你写成了a-b

2、如何对待异常

程序员在编写程序时,就应该充分考虑到各种可能发生的异常和错误,极力预防和避免,实在无法避免的,要编写相应的代码进行异常的检测、异常消息的提示,以及异常的处理。

3、异常的抛出机制

Java中是如何表示不同的异常情况,又是如何让程序员得知,并处理异常的呢?

Java中把不同的异常用不同的类表示,一旦发生某种异常,就通过创建该异常类型的对象,并且抛出,然后程序员可以catch到这个异常对象,并处理,如果无法catch到这个异常对象,那么这个异常对象将会导致程序终止。

运行下面的程序,程序会产生一个数组索引越界异常ArrayIndexOfBoundsException。我们通过图解来解析下异常产生和抛出的过程。

(二)Java异常体系

1、Throwable

java.lang.Throwable 类是 Java 语言中所有错误或异常的超类(父类)。

注:已存在的类称为超类 (superclass),新类称为子类(subclass)。

  • 只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java 的throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

Throwable中的常用方法:

  • public void printStackTrace():打印异常的详细信息。

    包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

  • public String getMessage():获取发生异常的原因。

    提示给用户的时候,就提示错误原因。

2、Error和Exception

   Throwable有两个直接子类:java.lang.Errorjava.lang.Exception,平常所说的异常指java.lang.Exception

 

 

  • Error:表示严重错误,一旦发生必须停下来查看问题并解决问题才能继续,无法仅仅通过try...catch解决的错误。(如果拿生病做比喻,就像是突发疾病,而且是危重症,必须立刻停下来治疗而不是靠短暂休息、吃药、打针、或小手术简单解决处理)

    • 例如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存溢出,简称OOM)。

  • Exception:表示普通异常,其它因编程错误或偶然的外在因素导致的一般性问题,程序员可以通过代码的方式检测、提示和纠正,使程序继续运行,但是只要发生也是必须处理,否则程序也会挂掉。(这就好比普通感冒、阑尾炎、牙疼等,可以通过短暂休息、吃药、打针、或小手术简单解决,但是也不能搁置不处理,不然也会要人命)。

    • 例如:空指针访问、试图读取不存在的文件、网络连接中断、数组下标越界等

无论是Error还是Exception,还有很多子类,异常的类型非常丰富。当代码运行出现异常时,特别是我们不熟悉的异常时,不要紧张,把异常的简单类名,拷贝到API中去查去认识它即可。

 (三) 受检异常和非受检异常

        我们平常说的异常就是指Exception,根据代码的编写编译阶段,编译器是否会警示当前代码可能发生xx异常,并督促程序员提前编写处理它的代码为依据,可以将异常分为:

  • 编译时期异常(即checked异常、受检异常):在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)xx异常,并督促程序员提前编写处理它的代码。如果程序员不听话,没有编写对应的异常处理代码,则编译器就会发威,直接判定编译失败,从而程序无法执行。通常,这类异常的发生不是由程序员的代码引起的,或者不是靠加简单判断就可以避免的,例如:FileNotFoundException(文件找不到异常)。

  • 运行时期异常(即runtime异常、unchecked非受检异常):即在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了xx异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免的。例如:ArrayIndexOutOfBoundsException数组下标越界异常,ClassCastException类型转换异常。

  • 常见的异常类型 

(四) 异常处理

在Java应用程序中,异常处理机制为:抛出异常、捕获异常。

 

 

① 抛出异常

当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统。

异常对象中包含了异常类型和异常出现时的程序状态等异常信息。

运行时系统负责寻找处置异常的代码并执行。

② 捕获异常

在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。

运行时系统从发生异常的方法开始,依次回查调用栈中的方法,当异常处理器搜能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。

当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

③Java异常处理的关键字 

Java异常处理的五个关键字:try、catch、finally、throw、throws  

⑴ try...catch基本格式 

捕获异常语法如下:

try{
     可能发生xx异常的代码
}catch(异常类型1  e){
     处理异常的代码1
}catch(异常类型2  e){
     处理异常的代码2
}
注: try{}中编写可能发生xx异常的业务逻辑代码。catch分支,分为两个部分,catch()中编写异常类型和异常参数名,{}中编写如果发生了这个异常,要做什么处理的代码。如果有多个catch分支,并且多个异常类型有父子类关系,必须保证小的子异常类型在上,(大的)父异常类型在下。

当某段代码可能发生异常,不管这个异常是编译时异常(受检异常)还是运行时异常(非受检异常),我们都可以使用try块将它括起来,并在try块下面编写catch分支尝试捕获对应的异常对象。

  • 如果在程序运行时,try块中的代码没有发生异常,那么catch所有的分支都不执行。

  • 如果在程序运行时,try块中的代码发生了异常,根据异常对象的类型,将从上到下选择第一个匹配的catch分支执行。此时try中发生异常的语句下面的代码将不执行,而整个try...catch之后的代码可以继续运行。

  • 如果在程序运行时,try块中的代码发生了异常,但是所有catch分支都无法匹配(捕获)这个异常,那么JVM将会终止当前方法的执行,并把异常对象“抛”给调用者。如果调用者不处理,程序就挂了。

 

 

⑵finally块

      因为异常会引发程序跳转,从而会导致有些语句执行不到。而程序中有一些特定的代码无论异常是否发生,都需要执行。例如,IO流的关闭,数据库连接的断开等。这样的代码通常就会放到finally块中。

 try{
     
 }catch(...){
     
 }finally{
     无论try中是否发生异常,也无论catch是否捕获异常,也不管try和catch中是否有return语句,都一定会执行
 }
 
 或
  try{
     
 }finally{
     无论try中是否发生异常,也不管try中是否有return语句,都一定会执行。
 } 

注意:finally不能单独使用。

当只有在try或者catch中调用退出JVM的相关方法,例如System.exit(0),此时finally才不会执行,否则finally永远会执行。

try-catch-finally语句: 

 

 

 

转换异常处理位置:throws

1、throws编译时异常

如果在编写方法体的代码时,某句代码可能发生某个==编译时异常==,不处理编译不通过,但是在当前方法体中可能不适合处理或无法给出合理的处理方式,就可以通过throws在方法签名中声明该方法可能会发生xx异常,需要调用者处理。

声明异常格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{   }  

在throws后面可以写多个异常类型,用逗号隔开。

2、throws运行时异常

       throws后面也可以写运行时异常类型,只是运行时异常类型,写或不写对于编译器和程序执行来说都没有任何区别。如果写了,唯一的区别就是调用者调用该方法后,使用try...catch结构时,IDEA可以获得更多的信息,需要添加什么catch分支。

3、方法重写对于throws要求

方法重写时,对于方法签名是有严格要求的:

(1)方法名必须相同

(2)形参列表必须相同

(3)返回值类型

  • 基本数据类型和void:必须相同

  • 引用数据类型:<=

(4)权限修饰符:>=,而且要求父类被重写方法在子类中是可见的

(5)不能是static,final修饰的方法

(6)throws异常列表要求

  • 如果父类被重写方法的方法签名后面没有 “throws 编译时异常类型”,那么重写方法时,方法签名后面也不能出现“throws 编译时异常类型”。

  • 如果父类被重写方法的方法签名后面有 “throws 编译时异常类型”,那么重写方法时,throws的编译时异常类型必须<=被重写方法throws的编译时异常类型,或者不throws编译时异常。

  • 方法重写,对于“throws 运行时异常类型”没有要求。

 

⑷手工抛出异常对象:throw

Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。异常对象的生成有两种方式:

  • 由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出。

  • 由开发人员手动创建:new 异常类型(【实参列表】);,如果创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样,但是一旦throw抛出,就会对程序运行产生影响了。

使用格式:

throw new 异常类名(参数);

throw语句抛出的异常对象,和JVM自动创建和抛出的异常对象一样。

  • 如果是编译时异常类型的对象,同样需要使用throws或者try...catch处理,否则编译不通过。

  • 如果是运行时异常类型的对象,编译器不提示。

  • 但是无论是编译时异常类型的对象,还是运行时异常类型的对象,如果没有被try..catch合理的处理,都会导致程序崩溃。

throw语句会导致程序执行流程被改变,throw语句是明确抛出一个异常对象,因此它下面的代码将不会执行,如果当前方法没有try...catch处理这个异常对象,throw语句就会代替return语句提前终止当前方法的执行,并返回一个异常对象给调用者。

 

 

 

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

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

相关文章

【软件工程】UML序列图

一.概述 序列图&#xff08;时序图&#xff09;是一种软件工程行化建模方法&#xff0c;用于可视化系统或应用程序中多个对象之间 的交互。在序列图中&#xff0c;每个对象都表示为竖直线&#xff0c;对象之间的消息则表示为水平箭头 从一个对象指向另一个对象。 序列图可以…

Canvas实现动态绘制圆周效果|实现奥运五环

步骤实现&#xff1a; 首先&#xff0c;创建一个 HTML 画布和一个 JavaScript 动画函数。 在画布上绘制一个圆。 定义一个变量来表示圆心的坐标和半径。 进行动画循环以更新圆心坐标&#xff0c;使其沿外圆周运动。 使用三角函数&#xff08;如 sin 和 cos&#xff09;来计…

如何带领小微企业在软件开发行业生存

文章目录 前言一、企业急需的技术人才需要掌握的技能二、人工智能开发者技能三、领导者需要掌握的知识和技能四、具备敏锐的技术视野的方法和途径五、人工智能技术论坛及组织六、机器学习相关论坛和组织七、新技术如何应用和落地1、了解新技术2、确定应用场景3、进行实践验证4、…

Pinia与Vuex区别、Pinia安装与使用

目录 一、Pinia和Vuex区别 二、Pinia使用state、getters、actions 1、安装使用Pinia 2、State 3、actions 4、getters 三、Pinia划分模块 1、目录结构 2、store/user.js 3、某组件使用 四、Pinia持久化存储 1、安装插件 2、store/index.js 3、store/user.js 4、…

Linux 内核设计与实现

文章目录 一、前言二、进程管理1、task_struct2、thread_info 三、调度四、系统调用五、内核数据结构1、kfifo2、映射3、二叉树 六、中断1、软中断2、tasklet3、工作队列4、下半部机制的选择5、下半部禁止与使能 七、内核同步方法1、原子操作2、自旋锁&#xff08;1&#xff09…

辛弃疾最经典的10首词

他&#xff0c;文能挥笔填词&#xff0c;武能上马杀敌&#xff1b; 他&#xff0c;被称为“词中之龙”&#xff0c; 他&#xff0c;一生赤子&#xff0c;追求收复山河&#xff1b; 他&#xff0c;是与苏轼齐名的豪放派词人&#xff1b; 他是辛弃疾。 辛弃疾一生怀着赤子之…

Bito:一款 iead/webstorm 神级插件,由 ChatGPT 团队开发,堪称辅助神器

前言&#xff1a; idea(后端)&#xff0c;webstorm(前端)中可以用的一款辅助插件&#xff1a;Bito 个人尝试体验效果&#xff1a; 优点是&#xff1a;可以自动完成一些场景代码。 缺点&#xff1a;太慢了&#xff0c;大部分时间一直转圈 摘取文档&#xff1a; 什么是Bito&…

UE4 架构初识(一)

UE引擎学习 一、基础框架 UObject: ​ UE创世&#xff0c;万物皆UObject&#xff0c;接着有Actor。UObject提供的元数据、反射生成、GC垃圾回收、序列化、编辑器可见&#xff0c;Class Default Object等&#xff0c;UE可以构建一个Object运行的世界。 Actor: 脱胎自Object的…

问题解决 | Failed to initialize NVML: Driver/library version mismatch

问题描述&#xff1a; Ubuntu20.04服务器上&#xff0c;一个docker容器正在训练模型&#xff0c;打开另外一个docker容器时&#xff0c;出现以下错误 Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to st…

数字设计小思 - 谈谈Latch:组合与时序逻辑的桥梁

前言 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。对于FPGA和ASIC设计中&#xff0c;避免使用Latch&#xff08;锁存器&#xff09;一直是个绕不开的话题&#xff0c;本文结合网上的文章&#xff0c;并根据示例介绍如何在实际设计中…

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM

学习如何通过构建一个简单的JavaScript颜色游戏来操作DOM 题目要求 我们将构建一个简单的颜色猜谜游戏。每次游戏启动时&#xff0c;都会选择一个随机的RGB颜色代码。根据游戏模式&#xff0c;我们将在屏幕上提供三个&#xff08;简单&#xff09;或六个&#xff08;困难&…

基于 SpringBoot + Vue 的智能停车场项目。

一、开源项目简介 基于 SpringBoot Vue 的智能停车场项目。 智能停车场管理平台&#xff01;科学计费 多种计费方案灵活切换&#xff0c;商场、小区、停车场等场景均适用&#xff01;无人值守 云端控制实现无岗亭模式下的车辆自主进出&#xff0c;降低人工成本&#xff01; …

Nacos,OpenFeign,Ribbon,loadBalance如何相互协调工作

1、SpringCloud规范 对于Nacos而言其作用在于服务注册发现和配置中心&#xff0c;对于Ribbon而言作用在于实现实例负载均衡&#xff0c;对于OpenFeign而言要通过rpc实现远程调用 2、Nacos实现服务注册发现 SpringCloud提供了ServiceRegistration接口&#xff0c;实现服务注册…

软件保护器:Themida 3.1.14 Crack

先进的Windows软件保护系统 版本&#xff1a;3.1 版本&#xff1a;3.1.4.0 日期&#xff1a;2022 年 11 月 10 日 概述 在创建应用程序时&#xff0c;Compiler 会将应用程序源代码编译成多个由机器语言代码构成的目标文件。然后将目标文件链接在一起以创建最终的可执行文件。 与…

【chapter29】【PyTorch】[交叉验证】

前言 前面讲了 Underfit , Overfit ,这里重点讲解一下如何检测 一 数据集划分 训练的时候&#xff0c;我们一般把数据集分成 训练集 和 验证集 每训练一轮或者几轮.validation 一次,看一下当前 验证集上的loss&acc 是否 提升.如果已经是最佳值,则提前结束训练,防止过拟合…

如何做好联络口译的译前准备工作?

我们知道&#xff0c;译前准备与口译质量有着紧密的联系。在联络口译中&#xff0c;对口译员的双语能力和知识储备有着十分高的要求&#xff0c;为了能够顺利完成口译任务&#xff0c;就必须进行译前准备。那么&#xff0c;如何做好译前准备工作&#xff1f;联络口译的译前准备…

强烈推荐这 6 款 API 测试工具,绝对有一款没听过

Postman: Postman 是一个流行的 API 开发和测试工具&#xff0c;提供了丰富的功能&#xff0c;包括请求构建、测试自动化、数据驱动等。用户可以通过 Postman 的界面轻松创建和测试 RESTful API。 Insomnia: Insomnia 是一款功能强大的开源 API 测试工具&#xff0c;支持多种协…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证

可参考之前发布的一篇文章&#xff0c;帮助你远程登录&#xff1a;远程连接提示 由于没有远程桌面授权服务器提供许可证_计算机没有远程桌面客户端访问许可证_csdn_aspnet的博客-CSDN博客 虽然上述文章命令可以远程进入系统&#xff0c;但是每次都需要使用上述文章中的命令进入…

MySQL高级篇——索引的创建与设计原则

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 一、索引的分类与使用 1.1 索引的分类 1.1.1. 普通索引 1.1.2. 唯一性索引 1.1.3. 主键索引&#xff08;唯一非空&#xff09; 1.1.4…

Jetson Orin MultiMedia 使用总结

1.Jetson Orin /Xavier 对于图片的输入以及输出处理有一套特定的API。代码存放在/usr/src/jetson_multimedia_api中。 2.其中最主要的几个头文件&#xff1a;缓存管理申请 nvbufsurface.h 缓存转换 nvbufsurftransform.h 显示 nvosd.h 以及显示模块。 3.YUV转RGB来分析一下各…