Java_异常

介绍

编译时异常:

        除RuntimeException和他的子类,其他都是编译时异常。编译阶段需要进行处理,作用在于提醒程序眼

运行时异常:

        RuntimeException本身和其所有子类,都是运行时异常。编译阶段不报错,是程序运行时出现的。一般是由于参数传递错误带来的问题

作用:

        作用一:异常是用来查询bug的关键信息

        作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

异常演示:

数组越界
代码:
public class ExceptionDemo1 {public static void main(String[] args) {String[] arr = {"111","222","333"};System.out.println(arr[10]);}
}
运行结果:

抛出异常:

目的:

        告诉调用者出错了

格式:

        在方法体中:throw+异常对象

        在定义方法中:在方法后写 throws+可能出现的异常类型(只需要写编译时异常)

        题目要求:设定学生对象的年龄应位于18~22之间

代码:
学生类:
public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {if(age < 18 || age > 22){throw new RuntimeException();}else {this.age = age;}}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}
测试类:
public class ExceptionDemo2 {public static void main(String[] args) {Student stu = new Student();stu.setAge(30);}
}
运行结果:

JVM虚拟机默认处理异常的方式:

        1.把异常的名称,异常原因及异常出现的位置等信息以红色字体输出在控制台

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

捕获异常:

目的:

        不让程序停止

格式:

        try{

                可能出现异常的代码

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

                出现上面小括号的异常类后的处理代码

        }

代码演示:
public class ExceptionDemo2 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};try {//可能出现异常的代码System.out.println(arr[10]);//↑此处出现了异常,程序就会在这里创建一个ArrayIndexOutOfBoundsException对象//拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接收这个对象//如果能接受,就表示该异常被捕获,执行catch里面对应的代码//当catch里面所有的代码执行完毕,继续执行try...catch体系下面的其他代码} catch(ArrayIndexOutOfBoundsException e) {//如果出现了ArrayIndexOutOfBoundsException异常,则运行下面代码↓System.out.println("数组越界");}System.out.println("后续代码仍执行");}
}
运行结果:

问题思考:

问题1:

        如果try中没有遇到问题,怎么执行?

代码演示:
public class ExceptionDemo3 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};try {//可能出现异常的代码System.out.println(arr[0]);} catch(ArrayIndexOutOfBoundsException e) {//如果出现了ArrayIndexOutOfBoundsException异常,则运行下面代码↓System.out.println("数组越界");}System.out.println("后续代码仍执行");}
}
运行结果:

答案:

        会执行try中的所有代码,不会执行catch中的代码,会执行后续代码

问题2:

        如果try中可能遇到多个问题,怎么执行?

代码演示:
public class ExceptionDemo4 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};try {System.out.println(arr[10]);System.out.println(2/0);} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界");}System.out.println("后续代码仍执行");}
}
运行结果:

答案:

        会执行到try中的出现异常的代码,不会执行后续代码,会执行出现指定异常类的catch中的代码,会执行后续代码,一般try中可能遇到多个问题的情况后面应写多个catch涵盖所有可能的异常类。并且如果要捕获多个异常,这些异常存在父子关系的话,那么父类要写到最下边。

问题3:

        如果try中遇到的问题没有被捕获,怎么执行?

代码演示:
public class ExceptionDemo5 {public static void main(String[] args) {int[] arr = {1,2,3};try {System.out.println(arr[10]);} catch (NullPointerException e) {System.out.println("空指针异常");}System.out.println("后续代码仍执行");}
}
运行结果:

答案:

        这种情况下没有捕获真正的异常,会采用JVM虚拟机默认处理异常的方式

问题4:

        如果try中遇到了问题,那么try下面的代码还会执行吗?

代码演示:
public class ExceptionDemo6 {public static void main(String[] args) {int[] arr = {1,2,3};try {System.out.println(arr[10]);System.out.println("----------");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组越界");}System.out.println("后续代码仍执行");}
}
运行结果:

答案:

        try下面的代码不会执行,直接跳转到对应的catch中,执行catch里面的语句体,如果没有对应的catch与之匹配,那么还是会交给虚拟机处理。

常见方法:

public String getMessage()      返回此throwable的详细消息字符串
public String toString()        返回此可抛出的简短描述
public void printStackTrace     把异常的错误信息以红色字体输出在控制台在底层是利用System.err.println进行输出细节:仅仅是打印信息,不会停止程序运行
代码演示:
public class ExceptionDemo7 {public static void main(String[] args) {/*public String getMessage()      返回此throwable的详细消息字符串public String toString()        返回此可抛出的简短描述public void printStackTrace     把异常的错误信息以红色字体输出在控制台在底层是利用System.err.println进行输出细节:仅仅是打印信息,不会停止程序运行*/int[] arr = {1,2,3};try {System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {//public String getMessage()      返回此throwable的详细消息字符串String message = e.getMessage();System.out.println(message);System.out.println();//public String toString()        返回此可抛出的简短描述String str = e.toString();System.out.println(str);System.out.println();//public void printStackTrace     把异常的错误信息以红色字体输出在控制台e.printStackTrace();}System.out.println("后续代码仍执行");}
}
运行结果:

综合练习:

需求:
键盘录入人类对象的姓名和年龄
姓名的长度在3~10之间
年龄的范围为18~40岁
超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止
提示:
需要考虑用户在键盘录入时的所有情况
比如:录入年龄时超出范围、录入年龄时录入abc等
代码:
public class ExceptionTest1 {public static void main(String[] args) {/*需求:键盘录入人类对象的姓名和年龄姓名的长度在3~10之间年龄的范围为18~40岁超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止提示:需要考虑用户在键盘录入时的所有情况比如:录入年龄时超出范围、录入年龄时录入abc等*///创建键盘录入对象Scanner sc = new Scanner(System.in);//创建人对象Person p = new Person();while (true) {try {//录入姓名System.out.println("请输入姓名");String name = sc.nextLine();p.setName(name);//录入年龄System.out.println("请输入年龄");String ageStr = sc.nextLine();int age = Integer.parseInt(ageStr);p.setAge(age);//没有异常直接跳出break;}catch (NumberFormatException e) {System.out.println("年龄格式不符合规范");} catch (RuntimeException e) {System.out.println("姓名或年龄不符合要求");}}System.out.println(p);}
}
运行结果:

自定义异常:

        意义:

                就是为了让控制台的报错信息更加的见名知意

        定义步骤:

                ①定义异常类

                ②写继承关系

                ③空参构造

                ④带参构造

        接下来使用自定义异常完善上述综合练习

代码演示:
异常类NameFormatException:
public class NameFormatException extends RuntimeException{public NameFormatException() {}public NameFormatException(String message) {super(message);}
}
异常类AgeOutOfBoundsException:
public class AgeOutOfBoundsException extends RuntimeException{public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message) {super(message);}
}
Person类:
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {if(name.length() < 3 || name.length() > 10) {throw new NameFormatException(name + "不满足长度3~10要求");}this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {if (age < 18 || age > 40) {throw new AgeOutOfBoundsException(age + "不属于18~40范围");}this.age = age;}public String toString() {return "Person{name = " + name + ", age = " + age + "}";}
}
测试类:
public class ExceptionTest1 {public static void main(String[] args) {/*需求:键盘录入人类对象的姓名和年龄姓名的长度在3~10之间年龄的范围为18~40岁超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止提示:需要考虑用户在键盘录入时的所有情况比如:录入年龄时超出范围、录入年龄时录入abc等*///创建键盘录入对象Scanner sc = new Scanner(System.in);//创建人对象Person p = new Person();while (true) {try {//录入姓名System.out.println("请输入姓名");String name = sc.nextLine();p.setName(name);//录入年龄System.out.println("请输入年龄");String ageStr = sc.nextLine();int age = Integer.parseInt(ageStr);p.setAge(age);//没有异常直接跳出break;} catch (NumberFormatException e) {e.printStackTrace();} catch (NameFormatException e) {e.printStackTrace();} catch (AgeOutOfBoundsException e) {e.printStackTrace();}}System.out.println(p);}
}
运行结果:

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

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

相关文章

Java17 --- SpringCloud之Nacos

目录 一、下载nacos并运行 1.1、创建9001微服务作为提供者 1.2、创建80微服务作为消费者 二、naocs配置中心规则与动态刷新 2.1、创建3377微服务 2.2、在nacos中创建配置文件 三、nacos数据模型之Namespace-Group-Datald 3.1、DatalD方案 3.2、Group方案 3.3、Name…

python软件开发遇到的坑-相对路径文件读写异常,不稳定

1. os.chdir()会影响那些使用相对路径读写文件的程序&#xff0c;使其变得不稳定&#xff0c;默认情况下&#xff0c;当前工作目录是主程序所在目录&#xff0c;使用os.chdir会将当前工作目录修改到其他路径。 资料&#xff1a; python相对路径写对了却报错是什么原因呢&#…

蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app

本文来自&#xff1a;蜜蜂收卡系统 加油卡充值卡礼品卡自定义回收系统源码 前后端开源uniapp可打包app - 源码1688 卡券绿色循环计划—— 一项旨在构建卡券价值再利用生态的社会责任感项目。在当前数字化消费日益普及的背景下&#xff0c;大量礼品卡、优惠券因各种原因未能有效…

mib browser读取mib文件的oid(飞塔防火墙为例)

在配置zabbix监控的时候,配置监控项最为麻烦,一般我们都会套用模板,这种方式比较简单,但是有些设备就是没有现成的zabbix模板,怎么办? 今天我们使用MIB Browser来获取设备SNMP的OID,然后加入zabbix 。 1.什么是MIB Browser SNMP客户端工具MIB Browser, 全名iReasonin…

ARP详解

2.4 ARP 如图2-10所示&#xff0c;当网络设备有数据要发送给另一台网络设备时&#xff0c;必须要知道对方的网络层地址&#xff08;即IP地址&#xff09;。IP地址由网络层来提供&#xff0c;但是仅有IP地址是不够的&#xff0c;IP数据报文必须封装成帧才能通过数据链路进行发送…

RuntimeError: Tensor must have a last dimension with stride 1

我在使用torch.view_as_complex将weight转化为复数时&#xff0c;遇到了这样一个错误&#xff1a;由于我在对weight使用view_as_complex之前使用了F.interpolate函数进行了分辨率调整&#xff0c;因此只需对张量weight添加.contiguous()即可。

拿到B端系统设计需求该如何入手,这样做准没错!

在拿到B端系统设计需求后&#xff0c;以下是一些入手的步骤和方法&#xff1a; 理解需求 首先&#xff0c;仔细阅读和理解所提供的需求文档。了解系统的目标、功能需求、用户需求、非功能需求等方面的要求。如果有任何不清楚或模糊的地方&#xff0c;及时与需求提出方进行沟通…

vue+sortablejs来实现列表拖拽——sortablejs的使用

sortablejs官网:https://sortablejs.com/ 最近在看form-builder组件&#xff0c;发现里面有用到sortablejs插件&#xff0c;用于实现拖拽效果。 但是这个官网中的配置&#xff0c;实在是看不懂&#xff0c;太简单又太复杂&#xff0c;不实用。 下面记录一下我的使用&#xff…

Redis 实战之RDB文件结构

RDB文件结构 databases 部分key_value_pairs 部分value 的编码字符串对象列表对象集合对象哈希表对象有序集合对象INTSET 编码的集合ZIPLIST 编码的列表、哈希表或者有序集合 总结AOF持久化的实现命令追加 AOF 文件的写入与同步小结 在本章之前的内容中&#xff0c; 我们介绍了…

C++优先级队列priority_queue模拟实现

priority_queue模拟实现 1. priority_queue介绍2. priority_queue使用2.1 priority_queue显示定义2.2priority_queue接口使用 3. 仿函数4. priority_queue模拟实现4.1 向上调整算法4.2 向下调整算法4.3 实现priority_queue的接口4.4 使用[仿函数](https://legacy.cplusplus.com…

Springboot+Vue项目-基于Java+MySQL的流浪动物管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

MCP3008-I/SL 模数转换器ADC SPI接口 模拟信号采集

MCP3008-I/SL 模数转换器ADC 贴片SOIC16 MCP3008-I/SL 是一款模数转换器&#xff08;ADC&#xff09;&#xff0c;属于 SAR&#xff08;逐次逼近寄存器&#xff09;架构的 ADC。它具有以下特点&#xff1a; 8 通道单 ADC 最大采样率&#xff1a;200ksps&#xff08;千样点每秒…

为什么byte 的取值范围是 [-128,127]

在计算机中&#xff0c;byte&#xff08;字节&#xff09;是存储数据的基本单位&#xff0c;通常用8位二进制数字表示一个字节。在字节中&#xff0c;最高位的最左边一位是符号位&#xff0c;用来表示正负号&#xff0c;值为0表示正数&#xff0c;值为1表示负数。 如果将byte定…

URL过滤

什么是URL过滤&#xff1f; URL过滤是一种针对用户的URL请求进行上网控制的技术&#xff0c;通过允许或禁止用户访问某些网页资源&#xff0c;达到规范上网行为和降低安全风险的目的。 URL过滤可以基于URL分类、特定URL等多种方式限制URL访问。 URL过滤的主要作用如下&#xf…

Python Flask框架(一)初识Flask

Flask是使用Python编写的Web微框架。Web框架可以使我们不用关心底层的请求响应处理&#xff0c;更方便高效的编写Web程序。Flask有两个主要依赖&#xff0c;一个是WSGI&#xff08;Web Server Gateway Interface&#xff0c;web服务器网关接口&#xff09;工具集&#xff0c;另…

【文献解析】3D高斯抛雪球是个什么玩意

论文地址&#xff1a;https://arxiv.org/abs/2308.04079 项目&#xff1a;3D Gaussian Splatting for Real-Time Radiance Field Rendering 代码&#xff1a;git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 一、文章概述 1.1问题导向 辐射…

USB3.0接口——(1)基础知识

1.背景 USB 3.0是一种USB规范&#xff0c;该规范由英特尔等公司发起。 USB协议版本 命名约定 USB-IF组织引入命名约定&#xff0c;将端口列为 USB 5 Gbps、USB 10 Gbps、USB 20 Gbps 、USB 40 Gbps&#xff0c;而不使用版本号。获得 USB-IF 认证的 USB 产品的制造商会获得带…

SAP 长文本语言代码维护

在SAP中&#xff0c;我们发现长文本都是有语言代码的&#xff0c;如果需要新增一个语言代码的话&#xff0c;需要通过程序RSCPCOLA进行维护处理 具体实现步骤如下&#xff1a; 1. 输入事务码SE38&#xff0c;输入程序名RSCPCOLA&#xff0c;然后点击执行按钮 2. 维护信函语言…

sklearn的make_blobs函数

make_blobs是一个用于生成随机数据点的实用函数&#xff0c; from sklearn.datasets import make_blobs X,Y make_blobs(n_samples2000,n_features2,centers12,cluster_std0.05,center_box[-5,5],random_state21)n_samples: 要生成的样本数量。centers: 要生成的簇&#xff0…

电子书3D翻页制作技巧大揭秘,轻松将文档转化为逼真仿真书!

随着数字化时代的到来&#xff0c;电子书已成为阅读的主流形式之一。然而&#xff0c;普通的电子书往往缺乏纸质书的质感和互动性&#xff0c;让人感到有些遗憾。今天&#xff0c;将为你揭秘电子书3D翻页制作技巧&#xff0c;让你轻松将文档转化为逼真仿真书&#xff01; 1.要制…