第2章 异常

📅 2026/7/6 3:35:15 👁️ 阅读次数 📝 编程学习
第2章 异常

一、异常介绍和体系介绍

指的是程序在编译或执行过程中,出现的非正常的情况 (错误)

ArrayIndexOutOfBoundsException

ClassCastException

NullPointerException ...

注意 : 语法错误, 不是异常.

所有的错误和异常都继承于Throwable类

Error:

严重级别问题

常见的 : 栈内存溢出 (StackOverflowError)

堆内存溢出 (OutOfMemoryError)

Exception:

RuntimeException 及其子类:运行时异常

除RuntimeException 之外所有的异常:编译时异常

堆内存溢出举例,内存装不下了

package com.itheima.error; ​ public class OOMTest { public static void main(String[] args) { int[] arr = new int[Integer.MAX_VALUE]; } }

运行时异常:

数组索引越界异常: ArrayIndexOutOfBoundsException

空指针异常 : NullPointerException

类型转换异常:ClassCastException

说明:编译阶段没有错误,运行时 [可能] 会出现的错误这种错误通常都是程序员代码不严谨所造成的

编译时异常:

编译阶段就出现的错误主要起到提醒作用

二、Java程序异常默认处理流程

阅读异常的处理顺序是从下往上看

异常默认的处理方式: 向上抛出

① 会在出现异常的位置, 创建一个异常对象 new ArithmeticException();

② 将异常对象向上抛出, 抛给main方法

③ main方法接收到异常对象, 继续向上抛出 new ArithmeticException();

④ JVM虚拟机接收到异常对象, 将异常的错误信息打印在控制台, 将程序停止.

package com.itheima.exception; ​ public class ExceptionDemo1 { /* 异常默认的处理方式: 向上抛出 */ public static void main(String[] args) { System.out.println("main方法开始执行..."); method(); // ③ main方法接收到异常对象, 继续向上抛出 new ArithmeticException(); // ④ JVM虚拟机接收到异常对象, 将异常的错误信息打印在控制台, 将程序停止. System.out.println("main方法执行结束..."); } ​ private static void method() { System.out.println("method方法开始..."); int i = 1 / 0; // ① 会在出现异常的位置, 创建一个异常对象 new ArithmeticException(); // ② 将异常对象向上抛出, 抛给main方法 System.out.println("method方法结束..."); } }

三、异常处理方式1-try...catch

Throwable的常见方法

public String getMessage()获取异常的错误原因

public void printStackTrace()展示完整的异常错误信息

package com.itheima.exception; ​ public class ExceptionDemo2 { /* 异常处理方式1 ​ try { ... } catch (异常类名 对象名) { ... } ​ 执行流程: 1. 执行try语句中的代码, 看是否有异常发生 2. 有的话, catch捕获异常, 执行内部的异常处理代码 3. 没有的话, 不会执行catch内部代码, 程序继续执行. */ public static void main(String[] args) { System.out.println("开始"); ​ try { int i = 1 / 1; ​ int[] arr = new int[10]; ​ System.out.println(arr[10]); ​ } catch (ArithmeticException e) { // ArithmeticException e = new ArithmeticException(); System.out.println("捕获了运算异常..."); } catch (NullPointerException e) { // NullPointerException e = new NullPointerException(); System.out.println("捕获了空指针异常..."); } catch (Exception e) { // Exception e = new ArrayIndexOutOfBoundsException(); String message = e.getMessage(); System.out.println(message);//获取异常的错误原因 e.printStackTrace();//展示完整的异常错误信息 System.out.println("捕获了其它异常..."); } ​ System.out.println("结束"); } }

四、try...catch练习

package com.itheima.test; ​ import com.itheima.exception.StudentAgeException; import com.itheima.pojo.Student; ​ import java.util.Scanner; ​ public class ExceptionTest { /* 键盘录入学生的姓名和年龄, 封装为学生对象并打印. ​ 异常的两种处理方式: 1. try...catch捕获异常 2. 抛出异常 ​ 使用思路: 看问题是否需要暴露 要: 抛出异常 不要: try...catch捕获. */ public static void main(String[] args) { ​ Scanner sc = new Scanner(System.in); ​ Student stu = new Student(); ​ System.out.println("请输入学生姓名: "); String name = sc.next(); stu.setName(name); ​ while (true) { try {//选中想要try catch的代码ctrl+alt+T产生try catch环绕 System.out.println("请输入学生年龄: "); int age = Integer.parseInt(sc.next());//包装类的转换方法,将数字字符串转换为数字,若输入有误就会抛出NumberFormatException stu.setAge(age); break; } catch (NumberFormatException e) { System.out.println("您输入的年龄有误, 请检查!"); } catch (StudentAgeException e) { System.out.println(e.getMessage()); } } ​ System.out.println(stu); } }

五、异常处理方式2-throws抛出

throw : 用在方法中, 后面跟的是异常对象,用于真正的抛出异常.

throws : 用在方法声明上, 后面跟的是异常类名, 作用是声明,声明方法中的异常做抛出处理.

细节: 如果抛出的异常对象, 是运行时异常, 就不需要编写throws, 反之必须写.

在student类中

package com.itheima.pojo; ​ import com.itheima.exception.StudentAgeException; ​ public class Student { private String name; private int age; ​ //空参有参构造 ​ //get、set方法 ​ ​ /* throw : 用在方法中, 后面跟的是异常对象, 用于真正的抛出异常. throws : 用在方法声明上, 后面跟的是异常类名, 作用是声明, 声明方法中的异常做抛出处理. ​ 细节: 如果抛出的异常对象, 是运行时异常, 就不需要编写throws, 反之必须写. */ public void setAge(int age) {//运行时异常不需要写throws if (age >= 0 && age <= 100) { this.age = age; } else { throw new StudentAgeException("年龄有误, 请检查是否是0~100之间的!"); } } ​ //toString方法 }

六、自定义异常

1、自定义编译时异常

定义一个异常类继承Exception.

重写构造器

2、自定义运行时异常

定义一个异常类继承RuntimeException.

重写构造器。

上面的age的get方法使用的是自定义异常,需要写一个异常类

package com.itheima.exception; ​ public class StudentAgeException extends RuntimeException { ​ public StudentAgeException() { } ​ public StudentAgeException(String message) { super(message); } ​ }