阶段二18_面向对象高级_异常
创始人
2025-05-31 22:54:50

知识点:

 1)异常体系图2)throws3)throw4)自定义异常5)idea快捷键:ctrl+alt+t -> 选择 try catch ctrl+d     -> 向下复制一行ctrl+alt+a -> 补全代码

一.异常体系图

Exception:称为异常类,它表示程序本身可以处理的问题
RuntimeException及其子类:运行时异常。 (空指针异常,数组索引越界异常) 
除RuntimeException之外所有的异常:编译期必须处理的,否则程序不能通过编译。(日期格式化异常)。

08/图片/异常体系图.PNG
在这里插入图片描述

二.JVM 的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理。
把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
程序停止执行

三.异常处理

1.异常处理方式 —— throws

 编译时异常因为在编译时就会检查,所以必须要写在方法后面进行显示声明运行时异常因为在运行时才会发生,所以在方法后面可以不写
 //---throws抛出异常--------public static void main(String[] args) throws ParseException {method2(); //还是继续交给调用者处理.而main方法的调用者是虚拟机还是会采取虚拟机默认处理异常的方法.}//如果方法中真的出现了异常,其实也是将这个异常交给了调用者处理.//如果声明的异常是一个编译时异常,那么声明的代码必须要手动写出.private static void method2() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");sdf.parse("2048-10月10日");}

2.抛出异常对象 —— throw

格式:throw new 异常();
注意:这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了。
//---throw手动创建异常--------
private static void printArr(int[] arr) {if(arr == null){//当参数为null的时候//手动创建了一个异常对象,抛给了调用者.throw new NullPointerException(); }else{for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}

3.throws 和 throw 的区别

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

4.异常处理方式 —— try…catch…

格式:
try {可能出现异常的代码;
} catch(异常类名 变量名) {异常的处理代码;
}
好处:可以让程序继续往下执行
//---try…catch处理异常案例------------------------
public class ExceptionDemo9 {public static void main(String[] args) {int [] arr = null;try{//有肯能发现异常的代码printArr(arr);}catch (NullPointerException e){//如果出现了这样的异常,那么我们进行的操作System.out.println("参数不能为null");}}private static void printArr(int[] arr) {if(arr == null){throw new NullPointerException();}else{for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]);}}}
}

5.异常处理方式 —— try…catch…

(1).如果 try 中没有遇到问题,怎么执行? 会把try中所有的代码全部执行完毕,不会执行catch里面的代码
(2).如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码
(3).如果出现的问题没有被捕获,那么程序如何运行?那么try...catch就相当于没有写.那么也就是自己没有处理.默认交给虚拟机处理.
(4).同时有可能出现多个异常怎么处理?出现多个异常,那么就写多个catch就可以了.注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面
//---try…catch处理异常案例------------------------
public class ExceptionDemo10 {public static void main(String[] args) {try {Scanner sc = new Scanner(System.in);System.out.println("请输入你的年龄");String line = sc.nextLine();int age = Integer.parseInt(line);//格式化异常System.out.println(age);System.out.println(2 / 0); //数学异常} catch (NumberFormatException e) {System.out.println("格式化异常出现了");}catch (ArithmeticException e) {System.out.println("数学运算异常出现了");}System.out.println("测试456");}
}

7.Throwable 的成员方法

public String getMessage()	    返回此 throwable 的详细消息字符串
public String toString()	    返回此可抛出的简短描述
public void printStackTrace()	把异常的错误信息输出在控制台

8.使用try…catch练习

 键盘录入学生的姓名和年龄,其中年龄为 18-25岁,超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止。
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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}//这里输入错误年龄范围,抛出异常给调用者处理public void setAge(int age) {if(age >= 18 && age <= 25){this.age = age;}else{throw new RuntimeException("年龄超出了范围");}}
}
public class ExceptionDemo12 {public static void main(String[] args) {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("请输入一个符合范围的年龄");continue; //处理异常后继续录入年龄数据}}System.out.println(s);}
}

9.自定义异常[ ctrl+alt+t -> 选择 try catch ctrl+d ->向下复制一行]

步骤:
(1)定义异常类 
(2)写继承关系 
(3)空参构造 
(4)带参构造自定义异常存在的意义:
就是为了让控制台的报错信息更加的见名之意
//---自定义异常实现和使用-----------------------------------------------
//自定义异常类
public class AgeOutOfBoundsException extends RuntimeException {public AgeOutOfBoundsException() {}public AgeOutOfBoundsException(String message) {super(message);}
}
//抛出自定义异常信息
throw new AgeOutOfBoundsException("年龄超出了范围");
//处理自定义异常
try {int age = Integer.parseInt(ageStr);s.setAge(age);
}catch (AgeOutOfBoundsException e) {System.out.println(e.toString());System.out.println("请输入一个符合范围的年龄");
}

四.更多内容
http://www.gxcode.top/code
在这里插入图片描述

相关内容

热门资讯

八分钟解决“微信金花链接房卡客... 微信金花链接是一款非常受欢迎的游戏,咨询房/卡添加微信:44858861许多玩家在游戏中会购买房卡来...
玩家必看“红豆娱乐房卡15元1... 红豆娱乐是一款非常受欢迎的游戏,咨询房/卡添加微信:44858861许多玩家在游戏中会购买房卡来享受...
玩家必看“微信平台牛牛房卡怎么... 【要素一】(KK)微信链接各大厅/房卡介绍微/44858861微信平台牛牛是一款非常火爆的游戏应用,...
一分钟讲解“卡卡大厅房卡充值”... 卡卡大厅是一款非常受欢迎的游戏,咨询房/卡添加微信:44858861许多玩家在游戏中会购买房卡来享受...
分享实测“玩微信牛牛房卡批发价... 玩微信牛牛是一款非常受欢迎的游戏,咨询房/卡添加微信:44858861许多玩家在游戏中会购买房卡来享...