Java_异常

一、异常

1.1 认识异常

接下来,我们学习一下异常,学习异常有利于我们处理程序中可能出现的问题。我先带着同学们认识一下,什么是异常?

我们阅读下面的代码,通过这段代码来认识异常。 我们调用一个方法时,经常一部小心就出异常了,然后在控制台打印一些异常信息。其实打印的这些异常信息,就叫做异常。

那肯定有同学就纳闷了,我写代码天天出异常,我知道这是异常啊!我们这里学习异常,其实是为了告诉你异常是怎么产生的?只有你知道异常是如何产生的,才能避免出现异常。以及产生异常之后如何处理。

在这里插入图片描述

因为写代码时经常会出现问题,Java的设计者们早就为我们写好了很多个异常类,来描述不同场景下的问题。而有些类是有共性的所以就有了异常的继承体系

在这里插入图片描述

先来演示一个运行时异常产生

int[] arr = {11,22,33};
//5是一个不存在的索引,所以此时产生ArrayIndexOutOfBoundsExcpetion
System.out.println(arr[5]); 

再来演示一个编译时异常

我们在调用SimpleDateFormat对象的parse方法时,要求传递的参数必须和指定的日期格式一致,否则就会出现异常。 Java比较贴心,它为了更加强烈的提醒方法的调用者,设计了编译时异常,它把异常的提醒提前了,你调用方法是否真的有问题,只要可能有问题就给你报出异常提示(红色波浪线)。

编译时异常的目的:意思就是告诉你,你小子注意了!!,这里小心点容易出错,仔细检查一下

在这里插入图片描述

有人说,我检查过了,我确认我的代码没问题,为了让它不报错,继续将代码写下去。我们这里有两种解决方案。
在这里插入图片描述

  • 第一种:使用throws在方法上声明,意思就是告诉下一个调用者,这里面可能有异常啊,你调用时注意一下。
/*** 目标:认识异常。*/
public class ExceptionTest1 {public static void main(String[] args) throws ParseException{SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse("2028-11-11 10:24");System.out.println(d);}
}
  • 第二种:使用try…catch语句块异常进行处理。
public class ExceptionTest1 {public static void main(String[] args) throws ParseException{try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse("2028-11-11 10:24");System.out.println(d);} catch (ParseException e) {e.printStackTrace();}}
}

1.2 自定义异常

在这里插入图片描述

认识了什么是异常,但是无法为这个世界上的全部问题都提供异常类,如果企业自己的某种问题,想通过异常来表示,那就需要自己来定义异常类了。

我们通过一个实际场景,来给大家演示自定义异常。

需求:写一个saveAge(int age)方法,在方法中对参数age进行判断,如果age<0或者>=150就认为年龄不合法,如果年龄不合法,就给调用者抛出一个年龄非法异常。

分析:Java的API中是没有年龄非法这个异常的,所以我们可以自定义一个异常类,用来表示年龄非法异常,然后再方法中抛出自定义异常即可。

自定义运行时异常


public class AgeillegalRuntimeException extends RuntimeException{public AgeillegalRuntimeException() {}public AgeillegalRuntimeException(String message) {super(message);}
}
public class ExceptionTest {public static void main(String[] args) {try {saveAge(160);System.out.println("底层运行成功!");} catch (Exception e) {//抓住抛出的异常对象//throw new RuntimeException(e);e.printStackTrace();System.out.println("底层出现了bug!");}}public static void saveAge(int age){if(age>0 && age<150){System.out.println("年龄被保存成功:"+age);}else{//使用一个异常对象封装这个问题//throw:将异常封装成一个对象抛出去。抛到那里呢?抛到方法的入口处,再抛给该方法的调用处throw new AgeillegalRuntimeException("/age is illegal, your age is " + age);}}
}

throw: 将异常封装成一个对象抛出去。抛到那里呢?抛到方法的入口处,再抛给该方法的调用处

自定义编译时异常

  • 先写一个异常类AgeIllegalException(这是自己取的名字,名字取得很奈斯),继承
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

throws:使用在方法上,抛出方法内部的异常,抛给上层调用者

// 1、必须让这个类继承自Exception,才能成为一个编译时异常类。
public class AgeIllegalException extends Exception{public AgeIllegalException() {}public AgeIllegalException(String message) {super(message);}
}
  • 再写一个测试类,在测试类中定义一个saveAge(int age)方法,对age判断如果年龄不在0~150之间,就抛出一个AgeIllegalException异常对象给调用者。
public class ExceptionTest2 {public static void main(String[] args) {// 需求:保存一个合法的年龄try {saveAge2(225);System.out.println("saveAge2底层执行是成功的!");} catch (AgeIllegalException e) {e.printStackTrace();System.out.println("saveAge2底层执行是出现bug的!");}}//2、在方法中对age进行判断,不合法则抛出AgeIllegalExceptionpublic static void saveAge(int age){if(age > 0 && age < 150){System.out.println("年龄被成功保存: " + age);}else {// 用一个异常对象封装这个问题// throw 抛出去这个异常对象throw new AgeIllegalRuntimeException("/age is illegal, your age is " + age);}}
}
  • 注意咯,自定义异常可能是编译时异常,也可以是运行时异常
1.如果自定义异常类继承Excpetion,则是编译时异常。特点:方法中抛出的是编译时异常,必须在方法上使用throws声明,强制调用者处理。2.如果自定义异常类继承RuntimeException,则运行时异常。特点:方法中抛出的是运行时异常,不需要在方法上用throws声明。

1.3 异常处理

同学们,通过前面两小节的学习,我们已经认识了什么是异常,以及异常的产生过程。接下来就需要告诉同学们,出现异常该如何处理了。

比如有如下的场景:A调用用B,B调用C;C中有异常产生抛给B,B中有异常产生又抛给A;异常到了A这里就不建议再抛出了,因为最终抛出被JVM处理程序就会异常终止,并且给用户看异常信息,用户也看不懂,体验很不好。

此时比较好的做法就是:1.将异常捕获,将比较友好的信息显示给用户看;2.尝试重新执行,看是是否能修复这个问题。
在这里插入图片描述
我们看一个代码,main方法调用test1方法,test1方法调用test2方法,test1和test2方法中多有扔异常。

  • 第一种处理方式是,在main方法中对异常进行try…catch捕获处理了,给出友好提示。
public class ExceptionTest3 {public static void main(String[] args)  {try {test1();} catch (FileNotFoundException e) {System.out.println("您要找的文件不存在!!");e.printStackTrace(); // 打印出这个异常对象的信息。记录下来。} catch (ParseException e) {System.out.println("您要解析的时间有问题了!");e.printStackTrace(); // 打印出这个异常对象的信息。记录下来。}}public static void test1() throws FileNotFoundException, ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse("2028-11-11 10:24:11");System.out.println(d);test2();}public static void test2() throws FileNotFoundException {// 读取文件的。InputStream is = new FileInputStream("D:/meinv.png");}
}

由于业务处理并不知道具体会抛出什么异常,所以就会简化抛出异常

在这里插入图片描述

  • 第二种处理方式是:在main方法中对异常进行捕获,并尝试修复
/*** 目标:掌握异常的处理方式:捕获异常,尝试修复。*/
public class ExceptionTest4 {public static void main(String[] args) {// 需求:调用一个方法,让用户输入一个合适的价格返回为止。// 尝试修复while (true) {try {System.out.println(getMoney());break;} catch (Exception e) {System.out.println("请您输入合法的数字!!");}}}public static double getMoney(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请您输入合适的价格:");double money = sc.nextDouble();if(money >= 0){return money;}else {System.out.println("您输入的价格是不合适的!");}}}
}

1.4 小结:

在这里插入图片描述

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

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

相关文章

论文Rebuttal常见格式与模板之中篇

论文Rebuttal常见格式与模板之中篇 前言5. Rebuttal可能遇到的问题5.4 实验不充分5.5 语法&#xff0c;结构&#xff0c;参考文献遗漏等问题5.6 非热点问题&#xff0c;研究意义&#xff1f; 6. 针对AC Message下篇笔记链接Rebuttal模板的好文 前言 这里承接上一篇笔记&#x…

opencv 入门一(显示一张图片)

头文件添加如下&#xff1a; 库目录添加如下&#xff1a; 依赖的库如下&#xff1a; #include <iostream> #include "opencv2/opencv.hpp" int main(int argc,char ** argv) { cv::Mat img cv::imread(argv[1], -1); if (img.empty()) return -1; …

原生JS实现组件切换(不刷新页面)

这是通过原生Es6实现的组件切换&#xff0c;代码很简单&#xff0c;原理和各种框架原理大致相同。 创建文件 ├── component&#xff1a;存放组件 │ ├── home1.js&#xff1a;组件1 │ ├── home2.js&#xff1a;组件2 ├── index.html ├── index.js初始化ht…

git的使用思维导图

源文件在github主页&#xff1a;study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)

全网好听的BGM都在这里下载,赶紧收藏好了

无论是自媒体创作者还是从事视频剪辑工作的朋友&#xff0c;对于BGM的选择都很重要&#xff0c;一首适配的BGM能大大提升你作品的质量&#xff0c;还能让作品更优秀。哪里才能找到好听又免费的BGM&#xff1f;下面推荐几个我多年收藏的6个音效、音频素材网站&#xff0c;赶紧收…

jdk多版本切换环境变量管理(jdk1.8和jdk17)

jdk多版本切换环境变量管理&#xff08;jdk1.8和jdk17&#xff09; 看了很多网上的博客&#xff0c;根本都不行&#xff0c;我总结出来规律如下&#xff1a; 首先环境变量要配置成这个样子&#xff1a;这些博客都会教你们配 接着配什么classpath&#xff0c;看其他博客就行 还…

鸿蒙开发之简单登录页面

Entry Component struct Index {State loading:booleanfalse;build() {Row() {Column({ space: 5 }) {Image($r("app.media.app_icon")).width(100).height(100).borderRadius(10).margin({top: 60})Text("登录界面").fontSize(40).fontWeight(FontWeight.…

Jmeter基础和概念(超详细整理)

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分&#xff1a; Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a…

javascript--深拷贝,浅拷贝区别

浅拷贝和深拷贝都是创建一份数据的拷贝。 js分为原始类型和引用类型&#xff0c;对于原始类型的拷贝&#xff0c;并没有深浅拷贝的区别&#xff0c;只有拷贝引用类型的时候存在深浅拷贝的区别的问题。 浅拷贝只进行一层复制&#xff0c;引用类型还是共享内存地址。 深拷贝是无…

原知因,正成为中产群体“精准抗衰”新选择

惧怕衰老&#xff0c;渴望长寿&#xff0c;是全人类的共同属性。而在现代生命科学的加持下&#xff0c;科学家们的勇气也前所未有的可畏&#xff0c;人类长寿基因发现者Nir Barzilai就是其中最具代表性的一位。作为人类史上首个抗衰老临床研究TAME的负责人&#xff0c;这位大佬…

金和OA jc6 clobfield接口存在SQL注入漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 金和OA协同办公管理系统j6软件是一种综合性的协同办公解决方案&#xff0c;旨在提高企业内部的协作效率和工作效率。它提供了一系列功能和工具&#xff0c;帮助组织进行任务管理、日程安排、文件共享、团队协作和…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…