认识异常

一、异常的概念和体系结构

1、异常的概念

在Java中,将程序执行过程中发生的不正常行为称为异常,常见的有算术异常,数组越界异常,空指针异常

2、异常的体系结构

从上图中可以看到:
1.Throwable:是异常体系的顶层类,其派生出两个重要的子类,Error和Exception
2.Error:指的是Java虚拟机无法解法的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生无力回天。
3.Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说的异常就是Exception。

3.异常的分类

分为编译时异常(受检查异常)和运行时异常(非受检查时异常)

二、异常的处理

1、防御式编程

★LBYL:在操作前就做充分的检查,例如:

  boolean ret=输入密码();

  if(!ret){

      处理输入密码错误;

      return;

}

  ret=选择功能();

  if(!ret){

       处理选择功能错误;

       return;

  }

.........

缺陷:正常流程和错误处理流程代码混在一起,代码整体显得比较混乱。

★EAFP:先操作,遇到问题在处理,例如:

try{

    输入密码;

    选择功能;

    .......

}catch(输入密码异常){

  处理密码异常;

}catch(选择功能异常){

  处理功能异常;

}.......

在Java中,异常处理主要的五个关键字:throw,try,catch,final,throws.

2.异常的抛出

在Java中,借助throw关键字,跑出一个指定的异常对象,将错误信息告知给调用者,具体语法:

  throw newXXXException(“异常产生的原因”);

例如:

throw newArrayindexOutOfBoundsException(“传递的数组下标越界”);

注意:

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

3、异常的捕获

异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws以及try-catch捕获处理。


◆ 异常声明throws

处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助throws将异常抛给方法的调用者来处理。即当前方法不处理异常,提醒方法的调用者处理异常。


语法格式:
修饰符 返回值类型 方法名(参数列表)throws异常类型1,异常类型2...{

}
需求:加载指定的配置文件config.ini


注意:

▲throws必须在方法的参数列表之后。

▲声明的异常必须是Exception或者Exception的子类。

▲方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型具有父子关系,直接声明父类即可。

▲调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出。

◆try-catch捕获并处理

throws对异常并没有真正处理,而是将异常报告给抛出异常方法的调用者,如果真正要对异常进行处理,就需要try-catch。

语法格式:
try{
   //将可能出现异常的代码放在这里
}catch(要捕获的异常类型 e){
   // 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到
    //对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码

    //try中可能会抛出多个不同的异常对象,则必须使用多个catch来捕获
}[catch(异常类型 e){
    //对异常进行处理
}finally{
    //此处代码一定会被执行到

}]

★[]中表示可选项,可以添加,也可以不用添加。

★try中的代码可能会抛出异常,也可能不会。try块内抛出的异常位置之后的代码将不会被执行。

★如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch。

可以通过Exception类是所有异常类的父类,因此可以用这个类型表示捕捉所以异常(不推荐)

◆finally

有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:网络连接、数据库连接、IO流等,在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

finally中的代码一定会执行的,一般在finally中进行一些资源清理的扫尾工作。

语法格式:
try{
   //可能会发生异常的代码
}catch(异常类型 e){
   //对捕获到的异常进行处理
}finally{
   //此处的语句无论是否发生异常,都会被执行到

}
//如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行

4、异常的处理流程

◇程序先执行 try中的代码。
◇如果 try中的代码出现异常,就会结束tr中的代码,看和catch中的异常类型是否匹配。

◇如果找到匹配的异常类型,就会执行catch中的代码。
◇如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者。
◇无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束之前执行).·如果上层调用者也没有处理的了异常,就继续向上传递。
◇一直到main方法也没有合适的代码处理异常,就会交给JVM来进行处理,此时程序就会异常终止。

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

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

相关文章

Euro Efficiency(POJ, Open judge)

题目链接: 1252 -- Euro Efficiency 题目描述: 思路: 题面的大概意思就是给你一组基本面值的钱币,问你要凑出指定的面值最少需要多少个钱币的参与,钱币的参与可以是加法也可以是减法。 分析一下,由于答案与钱币参与的顺序无关,…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支,它使计算机系统能够从经验中学习并改进其在特定任务上的表现,而无需进行明确的编程。机器学习涉及多种算法和统计模型,它们可以从数据中学习规律,并做出预测或决策。机器学习的应用非常广泛&…

LabVIEW的热门应用

LabVIEW是一种图形化编程语言,因其易用性和强大的功能,在多个行业和领域中广泛应用。介绍LabVIEW在以下五个热门应用领域中的使用情况,:工业自动化、医疗设备与生物医学工程、科学研究与实验室自动化、能源管理与智能电网、航空航…

[Shell编程学习路线]——if条件语句(单,双,多分支结构)详细语法介绍

🏡作者主页:点击! 🛠️Shell编程专栏:点击! ⏰️创作时间:2024年6月17日7点50分 🀄️文章质量:95分 文章目录 ————前言———— 💯趣站&#x1f4af…

C语言王国——深入自定义类型(结构体)

目录 一、引言 二、结构体 1. 结构体类型的声明 2. 结构体变量的创建和初始化 2.1 创建 2.2 初始化 2.3 typedef 2.4 特殊声明 2.5 自引用 3. 结构成员访问操作符 4. 结构体内存对齐 4.1 对齐规则 4.2 offsetof 4.3 为什么存在内存对齐 5. 结构体传参 6. 结构体实现…

RTOS实时操作系统

常见的RTOS有: VxWorks:广泛应用于工业、医疗、通信和航空航天领域。FreeRTOS:一个开源的RTOS,广泛用于嵌入式设备。uc/OS:一个适用于教育和小型商业项目的RTOS。QNX:主要应用于汽车和工业自动化领域。Win…

探索C嘎嘎的奇妙世界:第三关---缺省参数与函数重载

在c语言中,我们常常在对有参函数进行传参,这样的繁琐过程,C祖师爷对此进行了相关改进,多说无益,上干货: 1 缺省参数: 缺省参数是指在声明或定义函数时为函数的形参指定一个默认值(默认参数)。在调用该函数时,如果没有指定实参,则…

Linux常⽤服务器构建-ssh和scp

目录 1.ssh <1>ssh介绍 <2>安装ssh A.安装ssh服务器 B.远程登陆 <3>使⽤ssh连接服务器 2.scp 本地⽂件复制到远程&#xff1a; 本地⽬录复制到远程&#xff1a; 远程⽂件复制到本地&#xff1a; 远程⽬录复制到本地&#xff1a; 1.ssh <1>…

SQLite检索查询结果函数

代码 database.h #include <sqlite3.h> // &#xfffd;&#xfffd;&#xfffd;&#xfffd;SQLite&#xfffd;ӿں&#xfffd;&#xfffd;&#xfffd;#include<stdio.h>// &#xfffd;&#xfffd;&#xfffd;&#xfffd;һ&#xfffd;&#…

【git使用二】gitee远程仓库创建与本地git命令用法

目录 gitee介绍 管理者注册gitee账号 管理者在gitee网站上创建远程仓库 每个开发者安装git与基本配置 1.git的下载和安装 2.配置SSH公钥 3.开发者信息配置 git命令用法 gitee介绍 Gitee&#xff08;又称码云&#xff09;是一个基于Git的代码托管服务&#xff0c;由开源…

netty:promise的简单示例

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89442495 # 项目代码 【pom.xml】 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><v…

MyBatis进行模糊查询时SQL语句拼接引起的异常问题

项目场景&#xff1a; CRM项目&#xff0c;本文遇到的问题是在实现根据页面表单中输入条件&#xff0c;在数据库中分页模糊查询数据&#xff0c;并在页面分页显示的功能时&#xff0c;出现的“诡异”bug。 开发环境如下&#xff1a; 操作系统&#xff1a;Windows11 Java&#…

CAN测试工具——BUSMASTER

文章目录 推荐理由一、菜单栏Transmit WindowDiagnostics二、Tools推荐理由 BUSMASTER是一个用于设计,监测,分析与模拟CAN网络的开源的开放式总线PC软件. 1) 可以和十几种常用CAN总线硬件兼容。比如:IXXAT、PEAK、Kvaser、CANcase XL等。 2)免费,开源 https://rbei-etas.g…

乐鑫ESP32相关资料整理

乐鑫科技 Espressif 介绍 乐鑫科技 Espressif AIoT 领域软硬件产品的研发与设计&#xff0c;专注于研发高集成、低功耗、性能卓越、安全稳定、高性价比的无线通信 SoC&#xff0c;现已发布 ESP8266、ESP32、ESP32-S、ESP32-C 和 ESP32-H 系列芯片、模组和开发板。 Espressif Sy…

C++ virtual public(虚继承类)

这个"virtual"有什么作用&#xff1f; 由于C支持多重继承&#xff0c;所以对于一个派生类中有几个直接父类&#xff0c;而几个直接父类中有几个可能分别继承自某一个基类&#xff08;就是父类的父类&#xff09;&#xff0c;这样在构造最终派生类时&#xff0c;会出现…

【Vue3】插槽的使用及其分类

历史小剧场 后来我才明白&#xff0c;造反的宋江&#xff0c;和招安的宋江&#xff0c;始终是同一个人。 为什么要造反&#xff1f; 造反&#xff0c;就是为了招安。 ----《明朝那些事儿》 概念 在日常的项目开发中&#xff0c;当我们在编写一个完整的组件时&#xff0c;不可避…

【动态规划】0-1背包问题

【动态规划】0-1背包问题 题目:现在有四个物品&#xff0c;背包总容量为8&#xff0c;背包最多能装入价值为多少的物品? 我的图解 表格a【i】【j】表示的是容量为j的背包装入前i个物品的最大价值。 拿a【1】【1】来说&#xff0c;它的值就是背包容量为1&#xff0c;只考虑…

【探索Linux命令行】从基础指令到高级管道操作的介绍与实践

目录 man 指令&#xff08;说明&#xff09; 介绍 cp 指令&#xff08;复制&#xff09; ​编辑 mv 指令&#xff08;移动&#xff09; ​编辑 cat 指令&#xff08;类似cout&#xff09; less&#xff08;查找&#xff09; head & tail&#xff08;打印&#xff…

[数据集][目标检测]减速区域检测数据集VOC+YOLO格式1654张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1654 标注数量(xml文件个数)&#xff1a;1654 标注数量(txt文件个数)&#xff1a;1654 标注…

鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)

3、MMU汇编代码 在arch\arm\arm\include\arm.h文件中&#xff0c;封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。 3.1 CP15 C2 TTBR转换表基地址寄存器 代码比较简单&#xff0c;结合下图&#xff0c;自行查看即可。该图来自《ARM Cortex-A9 Tec…