文章目录

  • 一、异常
    • 1.异常
    • 2.编译时异常和运行时异常的区别
    • 3.JVM默认处理异常的方式
    • 4.查看异常信息
    • 5.throws方式处理异常
    • 6.throw抛出异常
    • 7.try-catch方式处理异常
    • 8.Throwable成员方法
    • 9.异常的练习
    • 10.自定义异常

一、异常

1.异常

  • 异常的概述

    ​ 异常就是程序出现了不正常的情况

  • 异常的体系结构

2.编译时异常和运行时异常的区别

  • 编译时异常

    • 都是Exception类及其子类
    • 必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常

    • 都是RuntimeException类及其子类
    • 无需显示处理,也可以和编译时异常一样处理
  • 图示

3.JVM默认处理异常的方式

  • 如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:

    • 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
    • 程序停止执行

4.查看异常信息

控制台在打印异常信息时,会打印异常类名,异常出现的原因,异常出现的位置

我们调bug时,可以根据提示,找到异常出现的位置,分析原因,修改异常代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEoETkej-1641394789269)(img\03_查看异常信息.png)]

5.throws方式处理异常

  • 定义格式

    public void 方法() throws 异常类名 {}
    
  • 示例代码

    public class ExceptionDemo {public static void main(String[] args) throws ParseException{System.out.println("开始");
    //        method();method2();System.out.println("结束");}//编译时异常public static void method2() throws ParseException {String s = "2048-08-09";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date d = sdf.parse(s);System.out.println(d);}//运行时异常public static void method() throws ArrayIndexOutOfBoundsException {int[] arr = {1, 2, 3};System.out.println(arr[3]);}
    }
    
  • 注意事项

    • 这个throws格式是跟在方法的括号后面的
    • 编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
    • 运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理

6.throw抛出异常

  • 格式

    throw new 异常();

  • 注意

    这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了

  • throws和throw的区别

    throws throw
    用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名
    表示声明异常,调用该方法有可能会出现这样的异常 表示手动抛出异常对象,由方法体内的语句处理
  • 示例代码

    public class ExceptionDemo8 {public static void main(String[] args) {//int [] arr = {1,2,3,4,5};int [] arr = null;printArr(arr);//就会 接收到一个异常.//我们还需要自己处理一下异常.}private static void printArr(int[] arr) {if(arr == null){//调用者知道成功打印了吗?//System.out.println("参数不能为null");throw new NullPointerException(); //当参数为null的时候//手动创建了一个异常对象,抛给了调用者,产生了一个异常}else{for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}}
    

7.try-catch方式处理异常

  • 定义格式

    try {可能出现异常的代码;
    } catch(异常类名 变量名) {异常的处理代码;
    }
    
  • 执行流程

    • 程序从 try 里面的代码开始执行
    • 出现异常,就会跳转到对应的 catch 里面去执行
    • 执行完毕之后,程序还可以继续往下执行
  • 示例代码

    public class ExceptionDemo01 {public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method() {try {int[] arr = {1, 2, 3};System.out.println(arr[3]);System.out.println("这里能够访问到吗");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");}}
    }
    
  • 注意

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

      会把try中所有的代码全部执行完毕,不会执行catch里面的代码

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

      那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了
      当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

    3. 如果出现的问题没有被捕获,那么程序如何运行?

      那么try…catch就相当于没有写.那么也就是自己没有处理.
      默认交给虚拟机处理.

    4. 同时有可能出现多个异常怎么处理?

      出现多个异常,那么就写多个catch就可以了.
      注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面

8.Throwable成员方法

  • 常用方法

    方法名 说明
    public String getMessage() 返回此 throwable 的详细消息字符串
    public String toString() 返回此可抛出的简短描述
    public void printStackTrace() 把异常的错误信息输出在控制台
  • 示例代码

    public class ExceptionDemo02 {public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method() {try {int[] arr = {1, 2, 3};System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();System.out.println("这里能够访问到吗");} catch (ArrayIndexOutOfBoundsException e) { //new ArrayIndexOutOfBoundsException();
    //            e.printStackTrace();//public String getMessage():返回此 throwable 的详细消息字符串
    //            System.out.println(e.getMessage());//Index 3 out of bounds for length 3//public String toString():返回此可抛出的简短描述
    //            System.out.println(e.toString());//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3//public void printStackTrace():把异常的错误信息输出在控制台e.printStackTrace();
    //            java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    //            at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
    //            at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11)}}
    }
    

9.异常的练习

  • 需求

    键盘录入学生的姓名和年龄,其中年龄为18 - 25岁,超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止

  • 实现步骤

    1. 创建学生对象
    2. 键盘录入姓名和年龄,并赋值给学生对象
    3. 如果是非法数据就再次录入
  • 代码实现

    学生类

    public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age >= 18 && age <= 25){this.age = age;}else{//当年龄不合法时,产生一个异常throw new RuntimeException("年龄超出了范围");}}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
    }
    

    测试类

    public class ExceptionDemo12 {public static void main(String[] args) {// 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,// 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。Student s = new Student();Scanner sc = new Scanner(System.in);System.out.println("请输入姓名");String name = sc.nextLine();s.setName(name);while(true){System.out.println("请输入年龄");String ageStr = sc.nextLine();try {int age = Integer.parseInt(ageStr);s.setAge(age);break;} catch (NumberFormatException e) {System.out.println("请输入一个整数");continue;} catch (AgeOutOfBoundsException e) {System.out.println(e.toString());System.out.println("请输入一个符合范围的年龄");continue;}/*if(age >= 18 && age <=25){s.setAge(age);break;}else{System.out.println("请输入符合要求的年龄");continue;}*/}System.out.println(s);}
    }
    

10.自定义异常

  • 自定义异常概述

    当Java中提供的异常不能满足我们的需求时,我们可以自定义异常

  • 实现步骤

    1. 定义异常类
    2. 写继承关系
    3. 提供空参构造
    4. 提供带参构造
  • 代码实现

    异常类

    public class AgeOutOfBoundsException extends RuntimeException {public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message) {super(message);}
    }
    

    学生类

    public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age >= 18 && age <= 25){this.age = age;}else{//如果Java中提供的异常不能满足我们的需求,我们可以使用自定义的异常throw new AgeOutOfBoundsException("年龄超出了范围");}}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
    }
    

    测试类

    public class ExceptionDemo12 {public static void main(String[] args) {// 键盘录入学生的姓名和年龄,其中年龄为 18 - 25岁,// 超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。Student s = new Student();Scanner sc = new Scanner(System.in);System.out.println("请输入姓名");String name = sc.nextLine();s.setName(name);while(true){System.out.println("请输入年龄");String ageStr = sc.nextLine();try {int age = Integer.parseInt(ageStr);s.setAge(age);break;} catch (NumberFormatException e) {System.out.println("请输入一个整数");continue;} catch (AgeOutOfBoundsException e) {System.out.println(e.toString());System.out.println("请输入一个符合范围的年龄");continue;}/*if(age >= 18 && age <=25){s.setAge(age);break;}else{System.out.println("请输入符合要求的年龄");continue;}*/}System.out.println(s);}
    }
    

【愚公系列】2023年01月 Java教学课程 045-异常处理相关推荐

  1. 【愚公系列】2023年01月 Java教学课程 030-static关键字

    文章目录 一.static关键字 1.static关键字概述 (理解) 2.static修饰的特点 (记忆) 3.static关键字注意事项 (理解) 二.static关键字内存分析 总结 一.sta ...

  2. 【愚公系列】2023年01月 Java教学课程 016-break和continue

    文章目录 一.break和continue 总结 break: continue: 一.break和continue 跳转控制语句(break) 跳出循环,结束循环 跳转控制语句(continue) ...

  3. 【愚公系列】2023年01月 Java教学课程 001-Java语言背景介绍

    文章目录 前言 一.Java语言的版本 二.Java SE 三.Java ME 四.Java EE 总结 前言 Java 语言 语言 : 人与人交流沟通的表达方式. 计算机语言 : 人与计算机之间进行 ...

  4. 【愚公系列】2023年01月 Java教学课程 039-Java中API

    文章目录 前言 一.常用API 1.Math 2.System 3. Object类的toString方法 4.Object类的equals方法 5.Objects 6.BigDecimal 前言 什 ...

  5. 【愚公系列】2023年01月 Java教学课程 003-Hello World的运行

    文章目录 前言 一.Hello World的运行 1.命令行执行 2.IDE执行 二.HelloWorld程序分析 前言 hello world的意思是"你好,世界".学习过c语言 ...

  6. 【愚公系列】2023年01月 Java教学课程 043-时间日期类

    文章目录 一.时间日期类 1.Date类 2.Date类常用方法 3.SimpleDateFormat类 4.时间日期类练习 一.时间日期类 1.Date类 计算机中时间原点 1970年1月1日 00 ...

  7. 【愚公系列】2023年01月 Java教学课程 004-Java语言三种注释

    文章目录 前言 一.单行注释 二.多行注释 三.文档注释 总结 前言 注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码.注释是编写程序时,写程序的人给一个语句.程序段.函数等的解释或提 ...

  8. 【愚公系列】2023年01月 Java教学课程 005-关键字

    文章目录 前言 一.关键字介绍 二.java关键字的分类 1.用于数据类型 2.用于语句 3.用于修饰 4.用于方法.类.接口.包和异常 前言 关键字是电脑语言里事先定义的,有特别意义的标识符,有时又 ...

  9. 【愚公系列】2023年01月 Java教学课程 017-Random随机数的使用

    文章目录 一.Random 1.Random产生随机数(掌握) 2.Random练习-猜数字(应用) 一.Random 1.Random产生随机数(掌握) 概述: Random类似Scanner,也是 ...

  10. 【愚公系列】2023年01月 Java教学课程 009-类型转换

    文章目录 一. 类型转换 1. 隐式转换 2. 强制转换 3.类型转换案例 一. 类型转换 在Java中,一些数据类型之间是可以相互转换的.分为两种情况:自动类型转换和强制类型转换. 1. 隐式转换 ...

最新文章

  1. R语言stringr包str_detect函数检测字符串中模式存在与否实战
  2. dump mysql_mysql/mariadb知识点总结(28):mysql备份工具之mysqldump
  3. JSP简单练习-用Servlet获取表单数据
  4. 【剑指offer - C++/Java】5、用两个栈实现队列
  5. html教程padding,HTML CSS——margin和padding的学习
  6. sencha app watch php,我的第一个基于SenchaTouch的WebApp
  7. 利用计算机管理分区,win7增加磁盘分区教学 利用磁盘管理增加分区
  8. 立刻、马上对你的电脑做这三件事!
  9. WebNN 人物检测、人脸识别、超分辨率、图像字幕、情感分析、噪声抑制
  10. 录音文件下载_轻便简洁的电脑录音软件,Moo0录音专家中文免费版,大小不过3M...
  11. PAT-求特殊方程的正整数解(简单编程题)
  12. Python制作古诗生成器
  13. 百度获取天气预报接口
  14. java 转义_java的StringEscapeUtils转义与反转义
  15. 辉芒微IO单片机FT60F112
  16. 【AI Studio平台基本操作】算力卡的使用获取及有关内容
  17. ARMv7 Processor modes
  18. 正宇丨揭秘你不知道的网络水军产业链运作内幕
  19. spring成神之路第二十九篇:BeanFactory 扩展(BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor)...
  20. 微信小程序 从零开发房屋租赁平台

热门文章

  1. 建立您的创业公司:提高安全性
  2. iqoo5什么时候上市
  3. python3获取oracle REST API for Oracle Eloqua Marketing Cloud Service 数据
  4. 怎样用html做网页上的小标,html基本操作,看了这些你就能做简易网页?
  5. js创建对象的几种方式-转载
  6. 软件测试面试题:优惠券的测试点包含哪些方面?测试点包含哪些方面?
  7. x210 uboot编译
  8. 创新型产品的需求发现
  9. 回顾 微信小程序template模板的使用 循环 赋值 点击事件
  10. python 区块链开发包_python语言-区块链开发