二十九、异常处理
目录
①前言:
②常见的运行时异常
③常见的编译时异常
④异常的处理机制
⑤自定义异常
①前言:
1.什么是异常?
异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。
比如: 数据索引越界异常,空指针异常,日期格式异常,等。
2.为什么要学习异常?
异常一旦出现,如果没有提前处理,程序就会退出JVM虚拟机而终止。
研究异常并且避免异常,然后提前处理异常,体现的是程序的安全,健壮性。
3.异常体系
Error: 系统级别的问题,JVM退出等,代码无法控制。
Exception: java.lang包下,称为异常类,它表示程序本身可以处理的问题。
RuntimeException及其子类: 运行时异常,编译阶段不会报错。(空指针异常,数组索引越界异常)
除RuntimeException之外的所有异常: 编译时异常,编译器必须处理的,否则程序不能通过编译。(日期格式化异常)
4.编译时异常和运行时异常
javac.exe 编译时异常,是在编译成class文件时必须要处理的异常,也称之为受检异常。
java.exe 运行时异常,在编译成class文件不需要处理,在运行字节码文件时可能出现的异常。
简单来说:
编译时异常,就是在编译时就出现的异常;
运行时异常,就是在运行时出现的异常。
②常见的运行时异常
1.运行时异常
直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。
2.运行时异常示例:
①数据索引越界异常ArrayIndexOutOfBoundsException
②空指针异常NullPointerException 直接输出没问题,但调用空指针的变量的功能就会报错
③类型转换异常ClassCastException
④数学操作异常ArithmeticException
⑤数字转换异常NumberFormatException
运行时异常:
一般是程序员业务没考虑就好或者编译逻辑不严谨引起的程序错误。
3.代码演示:
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**异常 程序在编译或运行中出现错误(语法错误不算在异常体系中)* Throwable* Error 系统级别的错误* Exception 程序级别的异常(RuntimeException 运行时异常 ) 编译时异常(受检异常)*/
public class Exception_Demo1 {public static void main(String[] args) throws ParseException {//运行时异常
// //1.数据索引越界异常ArrayIndexOutOfBoundsException
// int[] arr = {10,21,34};
// System.out.println(arr[3]);//越界异常
// //2.空指针异常NullPointerException 直接输出没问题,但调用空指针的变量的功能就会报错
// String name = null;
// System.out.println(name);
// System.out.println(name.length());
// //3.类型转换异常ClassCastException
// Object o = 23;
// String s = (String) o;
// //4.数学操作异常ArithmeticException
// int c = 10/0;
// //5.数据转换异常NumberFormatException
// String number = "23 aa bb";
// Integer it = Integer.valueOf(number);
// System.out.println(it+1);}
}
③常见的编译时异常
1.编译时异常
除RuntimeException之外的所有异常,编译阶段就报错,必须处理,否则代码不通过。
2.编译时异常的作用是什么?
担心程序员技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错;
3.代码演示:
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*** 编译时异常的解决方式:* 1、抛出异常:只能抛出一个异常* 抛出异常规范操作 直接抛出throws Exception{}* 抛出异常并不好,如果异常最终抛出去给虚拟机会引起程序死亡*2、 监视捕获异常格式 :捕获异常* try{* 监视可能出现异常的代码* }catch(异常类型1 变量){* //处理异常* }* 3、 前两者结合** 运行时异常处理方式:* 编译阶段不会报错,可以不抛,默认抛上去*/
public class Exception_Demo1 {public static void main(String[] args) throws ParseException {//编译时异常//简单日期格式化类
// String date = "2015-01-12 10:23:21";
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// //解析字符串成为日期对象
// Date d = sdf.parse(date);
// System.out.println(d);passTime("2022-12-11 12:24:13");}public static void passTime(String date){
System.out.println("--------------------------------------");try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);} catch (Exception e) {
// e.printStackTrace();//打印异常栈信息System.out.println("出现了解析时间异常");}try {InputStream is = new FileInputStream("E:/meinv.jpg");} catch (Exception ex) {
// ex.printStackTrace();System.out.println("没有这个文件,不要骗我");}}
}
④异常的处理机制
1.编译时异常
编译时异常是编译阶段就出错的,所以必须处理,否则代码根本无法通过。
2.编译时异常的处理形式有三种:
①出现异常直接抛出去给调用者,调用者也继续抛出去。
②出现异常自己捕获处理,不麻烦别人;
③前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
3.异常处理方式之一:throws
throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
这种处理方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
抛出异常格式:
规范做法:

4.异常处理方式之二:try...catch...
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
这种方式,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
格式:

5.异常处理方式之三:前两者结合
方法直接将异常通过throws抛出去给调用者
调用者收到异常后直接捕获处理。
6.代码演示:
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**Exception 异常处理方式*/
public class Exception_Test1 {//异常处理方式之二:try...catch...public static void main(String[] args) {System.out.println("程序开始~~");try {passTime("2022-12-11 12:24:13");System.out.println("程序操作成功~~");} catch (Exception e) {e.printStackTrace();System.out.println("程序操作失败~~");}System.out.println("程序结束~~");}
//异常处理方式之一:throwspublic static void passTime(String date) throws Exception{SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);
InputStream is = new FileInputStream("E:/meinv.jpg");}
}
7.异常处理的总结
在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。
实际应用中,只要代码能够编译通过,并且功能能完成,那么每一种异常处理方式似乎也都是可以的。
8.案例:异常处理使代码更稳健的案例
需求:
键盘录入一个合理的价格为止(必须是数值,值必须大于0)。
分析:
定义一个死循环,让用户不断的输入价格;
import java.util.Scanner;
/** 案例* 键盘录入一个合理的价格位置* 定义一个死循环,不断输入价格*/
public class Exception_Test2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (true) {try {System.out.println("请您输入一个合理的价格");String priceStr = sc.nextLine();//接一行数据//转换成double类型的价格 判断价格大于0double price = Double.valueOf(priceStr);if (price >0) {System.out.println("定价:"+price);break;}else {System.out.println("价格必须是正数~~");}} catch (NumberFormatException e) {System.out.println("用户输入的数据无效,请您输入合法的数据");}}System.out.println("----------------------------------");
//自定义异常try {checkAge(34);} catch (Exception_Demo2 e) {throw new RuntimeException(e);}}public static void checkAge(int age) throws Exception_Demo2 {if (age<0 || age>200){//抛出去一个异常对象给调用者//throw:在方法内部直接创建一个异常对象,并由此点抛出//throws:用在方法上面声明上的,抛出方法内部的异常throw new Exception_Demo2(age+"IS Illeagal!");}else {System.out.println("年龄合法,推荐商品给其购买");}}
}
⑤自定义异常
1.自定义异常的必要?
java无法为这个世界上全部问题提供异常类。
如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了。
2.自定义异常的好处?
可以使用异常的机制管理业务问题,如提醒程序员注意;
同时一旦出现bug,可以用异常的形式清晰的指出出错的地方。
3.自定义异常的分类
(1)自定义编译时异常
①定义一个异常继承Exception;
②重写构造器;
③在出现异常的地方用throw new自定义对象抛出。
作用:
编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理。
代码演示:
/**自定义异常* 1、自定义编译异常* 1。继承Exception* 2.重写构造器* 3.在出现异常的地方,用throw new自定义对象抛出* 作用:编译时异常编译时就报错,提醒更加强烈,一定需要处理** 2、自定义运行异常* 1。继承RuntimeException* 2.重写构造器* 3.在出现异常的地方,用throw new自定义对象抛出* 作用:运行时才出现*** throw:在方法内部直接创建一个异常对象,并由此点抛出* throws:用在方法上面声明上的,抛出方法内部的异常*/
public class Exception_Demo2 extends Exception {public static void main(String[] args) {try {checkAge(-34);} catch (Exception e) {throw new RuntimeException(e);}}
public static void checkAge(int age)throws Exception{if (age < 0 || age > 200){/*抛出一个异常对象给调用者throw:在方法内部直接创建一个异常对象,并从此点抛出。throws:用在方法申明上的,抛出方法内部的异常。*/
throw new Exception(age+"is illeagal");}else {System.out.println("年龄合法:推荐商品给其购买~~~");}}
}
(2)自定义运行时异常
①定义一个异常类继承RuntimeException;
②重写构造器;
③在出现异常的地方用throw new 自定义对象抛出。
作用:
提醒不强烈,编译阶段不报错,运行时才可能出现。
相关文章:
二十九、异常处理
目录 ①前言: ②常见的运行时异常 ③常见的编译时异常 ④异常的处理机制 ⑤自定义异常 ①前言: 1.什么是异常? 异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。 比如: 数据索引越界异常&…...
RTOS之二环境搭建初识RTOS
参考:https://blog.csdn.net/kouxi1/article/details/123650688视频:https://www.bilibili.com/video/BV1b14y1c783/RTOS本质就是切换线程栈,栈换了环境就换了,一个重要的结构tcb(linux叫PCB或thread_info)…...
【Java】 JAVA Notes
JAVA语言帮助笔记Java的安装与JDKJava命名规范JAVA的数据类型自动类型转换强制类型转换JAVA的运算符取余运算结果的符号逻辑运算的短路运算三元运算符运算符优先级JAVA的流程控制分支结构JAVA类Scanner类Math 类random方法获取随机数Java的安装与JDK JDK安装网站:h…...
Java笔记-volatile和AtomicInteger
目录1. volatile1.1.什么是volatile1.2.JMM-Java内存模型2 验证volatile的特性2.1 可见性2.2.验证volatile不保证原子性2.3 volatile实现禁止指令重排序3.使用AtomicInteger解决volatile的不能实现原子性的问题3.2 AtomicInteger的方法说明:3.3 CAS3.4 应用1. volat…...
[标准库]STM32F103R8T6 高级定时器--PWM输出和带死区互补PWM输出
前言 STM32F103系列的MCU,相比普通的51单片机,在输出硬件PWM这个功能上要强不少,两者实现的方式都类似,都是通过一个定时器来启用硬件PWM输出,不过在输出PWM通道的数量上,32F103要强上不少。仅通过一个高级…...
Camtasia2023最新版电脑视频录屏记录编辑软件
在Mac或Wind上有各种可用的视频记录和编辑软件,其中Camtasia被称为视频记录器和视频编辑器。录屏软件Camtasia2023到底有什么特色功能?本文将帮助您选择理想的选择来开始视频捕获,创建和编辑。Camtasia2023是Mac/win平台上一款使用非常简单的…...
管理用户安全性
每个数据库用户帐户都包括以下项:唯一的用户名验证方法 默认表空间临时表空间用户概要文件初始使用者组帐户状态验证用户口令验证、外部验证、全局验证管理员验证操作系统安全性:• DBA 必须具有创建或删除文件的操作系统权限。• 普通数据库用户不应具有…...
分享113个JS菜单导航,总有一款适合您
分享113个JS菜单导航,总有一款适合您 113个JS菜单导航下载链接:https://pan.baidu.com/s/1d4nnh-UAxNnSp9kfMBmPAw?pwdcw23 提取码:cw23 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "http…...
RuoYi-Cloud 部署
RuoYi-Cloud部署 1. 下载 点击右侧链接可以进入gitee的源码下载地址: 偌依微服务源码gitee下载地址 2. 数据库部署 依据如下步骤创建系统所需数据环境,脚本执行没有先后次序要求: 在Mysql 中创建 ry-cloud 主数据库,并执行 …...
DockerFile文件详解
一、DockerFile文件说明1、概述 Dockerfile是用来构建Docker镜像的文本文件,文本内容包含了一条条构建镜像所需的指令、参数和说明。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。即:Dockerfile仅…...
Java程序运行机制
Java语言既具有编译型语言的特征,又具有解释型语言的特征,Java程序要经过先编译后解释两个阶段。高级语言的运行机制📍编译型语言使用专门的编译器,针对特定的平台(移植性差),将高级语言的源代码…...
LeetCode刷题------字符串
目录 LeetCode:344.反转字符串 LeetCode:541. 反转字符串II LeetCode:剑指Offer 05.替换空格 LeetCode:151.翻转字符串里的单词 LeetCode:剑指Offer58-II.左旋转字符串 LeetCode:28. 实现 strStr() …...
区块链技术与应用2——BTC-数据结构
文章目录比特币中的数据结构1. 区块链(block chain)2. 默克尔树(Merkle tree)3.哈希指针的问题比特币中的数据结构 1. 区块链(block chain) 哈希指针: (1)保存数值的位置…...
BiseNet v1论文及其代码详解
来源:投稿 作者:蓬蓬奇 编辑:学姐 BiSeNet v1说明: 文章链接:https://arxiv.org/abs/1808.00897 官方开源代码:https://github.com/CoinCheung/BiSeNet (本文未使用) 文章标题&am…...
(超详细)Navicat的安装和激活,亲测有效
步骤一:准备安装包 下载Navicat,我用的v15最好一致(私信可以发你安装包和注册码)步骤二:关闭杀毒软件,然后需要断掉网络(一定断网) 步骤三:一路next安装,安装…...
JDY-31蓝牙模块使用指南
前言 本来是想买个hc-05,这种非常常用的模块,但是在优信电子买的时候,说有个可以替代的,没注意看,买回来折腾半天。 这个模块是从机模块,蓝牙模块分为主机从机和主从一体的,主机与从机的区别就…...
【2023】华为OD机试真题Java-题目0211-租车骑绿道
租车骑绿道 题目描述 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、最大载重 M M M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。 输入描述 第一行两个数字 m m m、...
leetcode: 3Sum
leetcode: 3Sum1. 题目描述2. 思考3. 解题3. 总结1. 题目描述 Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i ! j, i ! k, and j ! k, and nums[i] nums[j] nums[k] 0. Notice that the solution set must not contain …...
【Python学习笔记】26.Python3 输入和输出(2)
前言 本章节继续介绍Python的输入输出。 文件对象的方法 本节中剩下的例子假设已经创建了一个称为 f 的文件对象。 f.read() 为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。 size 是一个可选的数字类型的…...
vue项目第二天
项目中使用element-ui库中文网https://element.eleme.cn/#/zh-CN安装命令npm install element-ui安装按需加载babel插件npm install babel-plugin-component -Dnpm i //可以通过npm i 的指令让配置刷新重新配置一下项目中使用element-ui组件抽离文件中按需使用element ui &…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
