当前位置: 首页 > news >正文

二十九、异常处理

目录

①前言:

②常见的运行时异常

③常见的编译时异常

④异常的处理机制

⑤自定义异常


①前言:

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.什么是异常&#xff1f; 异常是程序在“编译”或者“执行”的过程中可能出现的问题&#xff0c;注意&#xff1a;语法错误不算在异常体系中。 比如: 数据索引越界异常&…...

RTOS之二环境搭建初识RTOS

参考&#xff1a;https://blog.csdn.net/kouxi1/article/details/123650688视频&#xff1a;https://www.bilibili.com/video/BV1b14y1c783/RTOS本质就是切换线程栈&#xff0c;栈换了环境就换了&#xff0c;一个重要的结构tcb&#xff08;linux叫PCB或thread_info&#xff09;…...

【Java】 JAVA Notes

JAVA语言帮助笔记Java的安装与JDKJava命名规范JAVA的数据类型自动类型转换强制类型转换JAVA的运算符取余运算结果的符号逻辑运算的短路运算三元运算符运算符优先级JAVA的流程控制分支结构JAVA类Scanner类Math 类random方法获取随机数Java的安装与JDK JDK安装网站&#xff1a;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的方法说明&#xff1a;3.3 CAS3.4 应用1. volat…...

[标准库]STM32F103R8T6 高级定时器--PWM输出和带死区互补PWM输出

前言 STM32F103系列的MCU&#xff0c;相比普通的51单片机&#xff0c;在输出硬件PWM这个功能上要强不少&#xff0c;两者实现的方式都类似&#xff0c;都是通过一个定时器来启用硬件PWM输出&#xff0c;不过在输出PWM通道的数量上&#xff0c;32F103要强上不少。仅通过一个高级…...

Camtasia2023最新版电脑视频录屏记录编辑软件

在Mac或Wind上有各种可用的视频记录和编辑软件&#xff0c;其中Camtasia被称为视频记录器和视频编辑器。录屏软件Camtasia2023到底有什么特色功能&#xff1f;本文将帮助您选择理想的选择来开始视频捕获&#xff0c;创建和编辑。Camtasia2023是Mac/win平台上一款使用非常简单的…...

管理用户安全性

每个数据库用户帐户都包括以下项&#xff1a;唯一的用户名验证方法 默认表空间临时表空间用户概要文件初始使用者组帐户状态验证用户口令验证、外部验证、全局验证管理员验证操作系统安全性&#xff1a;• DBA 必须具有创建或删除文件的操作系统权限。• 普通数据库用户不应具有…...

分享113个JS菜单导航,总有一款适合您

分享113个JS菜单导航&#xff0c;总有一款适合您 113个JS菜单导航下载链接&#xff1a;https://pan.baidu.com/s/1d4nnh-UAxNnSp9kfMBmPAw?pwdcw23 提取码&#xff1a;cw23 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "http…...

RuoYi-Cloud 部署

RuoYi-Cloud部署 1. 下载 点击右侧链接可以进入gitee的源码下载地址&#xff1a; 偌依微服务源码gitee下载地址 2. 数据库部署 依据如下步骤创建系统所需数据环境&#xff0c;脚本执行没有先后次序要求&#xff1a; 在Mysql 中创建 ry-cloud 主数据库&#xff0c;并执行 …...

DockerFile文件详解

一、DockerFile文件说明1、概述 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令、参数和说明。可以在Docker文件中使用RUN&#xff0c;CMD&#xff0c;FROM&#xff0c;EXPOSE&#xff0c;ENV等指令。即&#xff1a;Dockerfile仅…...

Java程序运行机制

Java语言既具有编译型语言的特征&#xff0c;又具有解释型语言的特征&#xff0c;Java程序要经过先编译后解释两个阶段。高级语言的运行机制&#x1f4cd;编译型语言使用专门的编译器&#xff0c;针对特定的平台&#xff08;移植性差&#xff09;&#xff0c;将高级语言的源代码…...

LeetCode刷题------字符串

目录 LeetCode&#xff1a;344.反转字符串 LeetCode&#xff1a;541. 反转字符串II LeetCode&#xff1a;剑指Offer 05.替换空格 LeetCode&#xff1a;151.翻转字符串里的单词 LeetCode&#xff1a;剑指Offer58-II.左旋转字符串 LeetCode&#xff1a;28. 实现 strStr() …...

区块链技术与应用2——BTC-数据结构

文章目录比特币中的数据结构1. 区块链&#xff08;block chain&#xff09;2. 默克尔树&#xff08;Merkle tree&#xff09;3.哈希指针的问题比特币中的数据结构 1. 区块链&#xff08;block chain&#xff09; 哈希指针&#xff1a; &#xff08;1&#xff09;保存数值的位置…...

BiseNet v1论文及其代码详解

来源&#xff1a;投稿 作者&#xff1a;蓬蓬奇 编辑&#xff1a;学姐 BiSeNet v1说明&#xff1a; 文章链接&#xff1a;https://arxiv.org/abs/1808.00897 官方开源代码&#xff1a;https://github.com/CoinCheung/BiSeNet &#xff08;本文未使用&#xff09; 文章标题&am…...

(超详细)Navicat的安装和激活,亲测有效

步骤一&#xff1a;准备安装包 下载Navicat&#xff0c;我用的v15最好一致&#xff08;私信可以发你安装包和注册码&#xff09;步骤二&#xff1a;关闭杀毒软件&#xff0c;然后需要断掉网络&#xff08;一定断网&#xff09; 步骤三&#xff1a;一路next安装&#xff0c;安装…...

JDY-31蓝牙模块使用指南

前言 本来是想买个hc-05&#xff0c;这种非常常用的模块&#xff0c;但是在优信电子买的时候&#xff0c;说有个可以替代的&#xff0c;没注意看&#xff0c;买回来折腾半天。 这个模块是从机模块&#xff0c;蓝牙模块分为主机从机和主从一体的&#xff0c;主机与从机的区别就…...

【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() 为了读取一个文件的内容&#xff0c;调用 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 &…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...