java-异常

一、异常的概念及分类

Exception:异常,代表程序可能出现的问题

Exception分为两类:

1、运行时异常RuntimeException以及其子类,编译阶段不会出现异常提醒,在运行阶段会出现异常提醒

2、编译时异常:编译阶段出现异常提醒

二、异常处理的方式

1、JVM默认的处理方式

把异常的原因、异常的名称、异常出现的位置以红色字体打印在控制台

程序停止执行,异常后面的代码不会再执行

public class test1 {public static void main(String[] args) {/*1、JVM默认的处理方式把异常的原因、异常的名称、异常出现的位置以红色字体打印在控制台程序停止执行,异常后面的代码不会再执行*/System.out.println("你好");System.out.println(1/0);System.out.println("我的世界");System.out.println("java");// 你好// ArithmeticException// 只会输出你好和异常信息 出现异常后面的代码不会再执行}
}

2、自己处理捕获异常

如果自己不捕获并处理异常 系统就会处理异常 那么就在控制台输出错误信息 并终止程序 如果我们不想要终止程序就必须自己捕获并处理异常 这就是自己捕获并处理异常的好处

(1)语法

try{

        可能出现异常的代码;

} catch(异常类名 变量名){

        异常的处理代码;

}

快捷键:

选中可能出现异常的代码 ctrl+alt+t

目的:

当代码出现异常时,可以让程序继续往下执行

public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/System.out.println("我的世界");/*此处出现算术异常,程序会创建一个码ArithmeticException类的对象 new ArithmeticException()然后拿着这个对象与catch的小括号中的对象进行对比 看是否匹配如果能接收 那么异常就会捕获 就会执行catch里面的代码当执行完try...catch后 程序会继续往下执行 输出java*/try {// 可能出现异常的代码System.out.println(1/0);}catch (ArithmeticException e){// 出现异常代码后执行的操作System.out.println("算术异常 被除数不能是0");}// 执行完try...catch后 程序会继续往下执行System.out.println("java");// 输出:// 我的世界// 算术异常 被除数不能是0// java}
}

(2)注意

1、如果try中代码没有出现异常,那么系统会执行完try中所有的代码,不会执行catch语句体(只有try语句体出现异常才会执行catch语句体)

public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/try {// 可能出现异常的代码// 当没有出现异常时 会执行完所有的代码System.out.println("你好");System.out.println("java");}catch (ArithmeticException e){// 出现异常代码后执行的操作// 当没有出现异常时 不会执行代码System.out.println("算术异常 被除数不能是0");}// 执行完try...catch后 程序会继续往下执行System.out.println("我的世界");// 输出:// 你好// java// 我的世界}
}

2、如果try中代码有多个异常,但是catch中罗列的异常情况没有包括try中的所有异常,程序可能终止,可能不终止

如果程序没有捕获到异常就会终止程序(相当于try...catch白写了 最终还是交给虚拟机进行处理) 如果捕获到了就不会终止程序

public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/int [] arr=new int[] {1,2,3,4,5};try {// 可能出现异常的代码System.out.println(arr[10]);System.out.println(1/0);}catch (ArithmeticException e){// 出现异常代码后执行的操作System.out.println("算术异常 被除数不能是0");}System.out.println("我的世界"); // 因此不会输出我的世界/*分析:System.out.println(arr[10]);出现了索引异常 就会与catch括号中的异常进行匹配现在 ArithmeticException e 与 new ArrayIndexOutOfBoundsException()无法匹配错误捕获不到由于 ArrayIndexOutOfBoundsException 异常没有在 catch 块中被捕获处理,程序会在此处中断,不会继续执行后面的代码*/// 输出:// ArrayIndexOutOfBoundsException}
}
public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/int [] arr=new int[] {1,2,3,4,5};try {// 可能出现异常的代码System.out.println(1/0);System.out.println(arr[10]);}catch (ArithmeticException e){// 出现异常代码后执行的操作System.out.println("算术异常 被除数不能是0");}System.out.println("我的世界"); /*分析:System.out.println(1/0);出现了算术异常 就会与catch括号中的异常进行匹配因此trySystem.out.println(arr[10]);就不会执行(即使有错误也执行不到)现在 ArithmeticException e 与 new ArithmeticException()匹配错误捕获到 由于捕获到错误就会执行catch的语句体执行完try...catch之后 程序继续往下执行 输出我的世界*/// 输出:// 算术异常 被除数不能是0// 我的世界}
}

解决方法:写多个catch语句罗列所有的异常情况,如果这些异常存在父子关系,那么父类一定要写在最下面

根据多态的概念 父类可以接收子类的对象 如果将父类异常放在上面 那么try语句体出现的异常都会被父类异常接收 那么父类异常下面的异常永远执行不到

在JDK7以后 如果多个catch的语句体执行的操作是一样的 那么异常可以写在一个catch语句体中

注意:写在同一个catch括号中的异常不能存在父子关系 各个异常之间用|隔开 不能用||隔开

public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/int [] arr=new int[] {1,2,3,4,5};try {// 可能出现异常的代码// 每次只捕获一个错误 捕获到了就执行catch语句体System.out.println(1/0);System.out.println(arr[10]);}catch (ArrayIndexOutOfBoundsException |ArithmeticException e){// 不能写成ArrayIndexOutOfBoundsException ||ArithmeticException e// 或者ArrayIndexOutOfBoundsException e|ArithmeticException e// 出现异常代码后执行的操作System.out.println("异常");}System.out.println("我的世界"); // 为什么不能输出}
}

(3)问题总结

(4)对异常常见的处理方法

1、异常对象名称.getMessage();

该方法返回有关异常的简短描述

public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/int [] arr=new int[] {1,2,3,4,5};try {System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {// e.getMessage() 返回值是有关异常的简短描述String str= e.getMessage();System.out.println(str);}System.out.println("我的世界");// Index 10 out of bounds for length 5// 我的世界}
}

2、异常对象名称.toString();

该方法返回有关异常的简短描述

public class test1 {public static void main(String[] args) {/*2、自己处理语法:try{可能出现异常的代码;} catch(异常类名 变量名){异常的处理代码;}*/int [] arr=new int[] {1,2,3,4,5};try {System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {// e.getMessage() 返回值是有关异常的简短描述String str= e.toString();System.out.println(str);}System.out.println("我的世界");// java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 5// 我的世界}
}

3、异常对象名称.printStackTrace();

无返回值 直接在控制台以红色字体打印异常信息 不会终止程序

3、抛出异常

用于方法中可能出现的异常

(1)throws

写在方法的定义处,表示声明一个异常,告诉调用者使用本方法可能会有哪些异常,如果是运行时异常,那么throws在方法定义处抛出的异常可以不写,但如果是编译时异常,那么throws在方法定义处抛出的异常必须要写

语法:

public void 方法() throws 异常类名1,异常类名2...{

        ....

}

(2)throw

写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中异常下面的代码就不再执行力

语法:

public void 方法() {

        throws 异常类名1,异常类名2...

}

public class test1 {public static void main(String[] args) {// 对抛出的异常 我们需要进行处理 可以采取自己捕获错误的方式 try...catchint [] arr=new int[0];try {System.out.println(getMax(arr));} catch (NullPointerException e) {System.out.println("空指针异常");}catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界访问异常");}}// throws NullPointerException,ArrayIndexOutOfBoundsException// 这段代码告诉调用者 调用getMax方法可能会出现NullPointerException,ArrayIndexOutOfBoundsException的错误// 因为NullPointerException,ArrayIndexOutOfBoundsException都属于运行时异常RuntimeException// 因此在方法头定义处可以不写throws NullPointerException,ArrayIndexOutOfBoundsExceptionpublic static int getMax (int [] arr)throws NullPointerException,ArrayIndexOutOfBoundsException{// 当数组为null意味着该数组变量不指向任何数组的内存地址if(arr==null){// 抛出空指针异常给调用者throw new NullPointerException();}// 当没有数组元素时 抛出索引越界异常if(arr.length==0){// 抛出索引越界异常给调用者throw new ArrayIndexOutOfBoundsException();}int max=arr[0];for (int i = 1; i < arr.length; i++) {if(arr[i]>max){max=arr[i];}}return max;}
}

抛出异常通常和捕获异常相结合

三、自定义异常

创建步骤:

1、定义异常类

类名见名知意

2、写继承关系

如果是编译时异常就继承Exception

如果是运行时异常就继承RuntimeException

3、定义空参构造

4、定义带参构造

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

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

相关文章

基于SpringBoot+Vue网上商城系统的设计与实现

系统介绍 随着社会的不断进步与发展&#xff0c;人们经济水平也不断的提高&#xff0c;于是对各行各业需求也越来越高。特别是从2019年新型冠状病毒爆发以来&#xff0c;利用计算机网络来处理各行业事务这一概念更深入人心&#xff0c;由于用户工作繁忙的原因&#xff0c;去商…

抽象工厂模式设计实验

【实验内容】 楚锋软件公司欲开发一套界面皮肤库&#xff0c;可以对 Java 桌面软件进行界面美化。为了保护版权&#xff0c;该皮肤库源代码不打算公开&#xff0c;而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤&#xff0c;不同的…

Java数据类型以及范围

数据类型&#xff1a; 取值范围&#xff1a; 取值&#xff1a;

磁性呼吸传感技术与机器学习结合在COVID-19审断中的应用

介绍 呼吸不仅是人类生存的基础&#xff0c;而且其模式也是评估个体健康状态的关键指标。异常的呼吸模式往往是呼吸系统疾病的一个警示信号&#xff0c;包括但不限于慢性阻塞性肺病&#xff08;COPD&#xff09;、阻塞性睡眠呼吸暂停&#xff08;OSA&#xff09;、肺炎、囊性纤…

idea连接Docker数据库

我们在docker下创建了数据库&#xff0c;想要更方便的查看和操作该数据库&#xff0c;idea和DataGrip或者其他软件都可以。在数据库连接时需要填写数据库名字&#xff0c;主机&#xff0c;端口&#xff0c;数据库用户名和密码。 输入之后先不要点击OK和按Enter键&#xff0c;我…

GAN详解,公式推导解读,详细到每一步的理论推导

在看这一篇文章之前&#xff0c;希望熟悉掌握熵的知识&#xff0c;可看我写的跟熵相关的一篇博客https://blog.csdn.net/m0_59156726/article/details/138128622 1. GAN 原始论文&#xff1a;https://arxiv.org/pdf/1406.2661.pdf 放一张GAN的结构&#xff0c;如下&#xff1…

Linux:动静态库介绍

动静态库 库的介绍开发环境 & 编译器库存在的意义库的实现库的命名静态库制作和使用总结 动态库的制作和使用动态库的使用方法方法一方法二方法三 库加载问题静态库加载问题动态库的加载问题与位置无关码 C/C静态库下载方式 库的介绍 静态库&#xff1a;程序在编译链接的时…

计算机网络---第十一天

生成树协议 stp作用&#xff1a; 作用&#xff1a;stp用于解决二层环路问题。 BPDU&#xff1a; 含义&#xff1a;桥协议数据单元&#xff0c;用于传递stp协议相关报文 分类&#xff1a;配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

数据库主键ID自增,两种方法获取插入数据库那条数据自动生成的主键ID值

目录 1. 前言 2. 适用于 MyBatis 框架 2.1 获取单条插入语句生成的ID 2.2 获取集合插入生成的多条数据的ID 3. 适用于 MyBatisPlus 框架 3.1 获取单条数据插入生成的ID 3.2 获取集合插入数据生成的多条数据的ID 4. 小结 1. 前言 在开发过程中&#xff0c;我们可能会遇…

OpenCompass 大模型评测实战——作业

OpenCompass 大模型评测实战——作业 一、基础作业1.1、使用 OpenCompass 评测 internlm2-chat-1_8b 模型在 C-Eval 数据集上的性能1.1.1、安装基本环境1.1.2、解压数据集1.1.3、查看支持的数据集和模型1.1.4、启动评测 二、进阶作业2.1、将自定义数据集提交至OpenCompass官网 …

2024春季春日主题活动策划方案

2024解冻派对“春日浪漫”主题活动策划方案-32P 方案页码&#xff1a;32页 文件格式&#xff1a;pptx 方案简介&#xff1a; 春来一季&#xff0c;新生欢喜 花香丨微风丨阳光 活动唤起【春日浪漫记忆】&#xff01; 年轻人不一样的派对活动 可以与朋友/小朋友/家人互动…

深度学习-线性代数

目录 标量向量矩阵特殊矩阵特征向量和特征值 标量由只有一个元素的张量表示将向量视为标量值组成的列表通过张量的索引来访问任一元素访问张量的长度只有一个轴的张量&#xff0c;形状只有一个元素通过指定两个分量m和n来创建一个形状为mn的矩阵矩阵的转置对称矩阵的转置逻辑运…

03-JAVA设计模式-访问者模式

访问者模式 什么是访问者模式 访问者模式&#xff08;Visitor Pattern&#xff09;是软件设计模式中的一种行为模式&#xff0c;它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中&#xff0c;我们…

图文教程 | Git安装配置、常用命令大全以及常见问题

前言 因为多了一台电脑&#xff0c;平时写一些代码&#xff0c;改一些文件&#xff0c;用U盘存着转来转去特别麻烦。于是打算用Git管理我的文件&#xff0c;方便在两个终端之间传输数据啥的。也正好给新电脑装好Git。 &#x1f4e2;博客主页&#xff1a;程序源⠀-CSDN博客 &…

HFSS端口介绍2---波端口

前面我们讨论了Lumped Port设定相关的内容,这节我们继续讨论Wave Port(波端口)使用相关的问题。 波端口使用范围 封闭结构:如波导、同轴电缆等 包含多个传播模式的模型 端口平面在求解区域外的模型 模型中包含均匀的波导或者传输线结构 波端口的大小 对于封闭的传输线结构:边…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程&#xff0c;在您的应用中释放人工智能的力量。随着人工智能技术的快速发展&#xff0c;比以往任何时候都更重要的是保持领先地位&#xff0c;并为您的项目利用这些尖端工具。在本课程中&#xff0c;您将深入了解人工智能驱动…

物联网硬件设计开发全攻略:十大关键阶段深度解析

为物联网应用设计开发高效稳定的硬件系统本身是一项既复杂又精细的艰巨任务。看似小巧的物联网设备一般由软件、固件和硬件组件组成&#xff0c;其中&#xff0c;硬件组件更是占据了约80%的成本与开发挑战。那么&#xff0c;为何硬件部分如此棘手&#xff1f;在这篇文章中&…

x汽车登陆网站登陆rsa加密逆向

声明&#xff1a; 本文章内容仅供学习交流&#xff0c;不用于其他其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c; 各位看官好哇&#xff0c;今天给大家带来一篇web自动化逆向的文章&#xff0c;如下图当前我…

芯科科技大大简化面向无电池物联网的能量采集产品的开发

芯科科技推出其迄今最高能量效率且支持能量采集功能的无线SoC 中国&#xff0c;北京 – 2024年4月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;…

超星图书转成PDF格式

转为pdf 为避免浪费您的时间&#xff0c;本篇转载文章不值得花费您的宝贵时间阅读 方法一 感谢医学插画动画杜鹏 Roison An两位提供的方法&#xff0c;经试验后简化了一下&#xff0c;得出以下方法:1、使用超星打开你想要转换的图书2、依次打开本书的所有页面&#xff0c;不要…