异常的体系结构:异常就是程序出现了不正常的情况,用来描述代码中出现的问题的,语法错误不是异常体系。
JVM默认处理异常的方式:
- Throwable
- 包含Error和Exception
- Error:严重错误,程序无法解决的问题
- Exception:异常类,分为编译时异常和运行时异常两部分
- 编译时异常
除了RuntimeException类及其子类之外的所有异常
必须显示处理,否则程序就会发生错误,无法通过编译
- 运行时异常
RuntimeException类及其子类
无需显示处理,也可以和编译时异常一样处理
查看异常信息:
- JVM默认处理的两个步骤:
把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
程序停止执行
throws方式处理异常:
- 控制台在打印异常信息时,会打印异常类名,异常出现的原因,异常出现的位置
- 可以根据提示,找到异常出现的位置,分析原因,修改异常代码
throw抛出异常:
- 声明一个异常
- 格式
public void 方法() throws 异常类名 {...}
- 注意
这个throws格式是跟在方法的括号后面的
编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处
- 示例代码
//编译时异常,声明出来,谁调用谁处理 public static void method1() throws ParseException { String s = "2048-08-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(s); System.out.println(d); } //运行时异常-索引越界,编译不检查。 //可以用不用声明,JVM调用使用默认处理 public static void method2() throws ArrayIndexOutOfBoundsException { int[] arr = {1, 2, 3}; System.out.println(arr[3]); }
try-catch方式处理异常:
- 格式
throw new 异常();
- 注意
这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了
- throws和throw的区别
throws throw 用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名 表示声明异常,调用该方法有可能会出现这样的异常 表示手动抛出异常对象,由方法体内的语句处理 - 示例代码
public class ExceptionDemo1 { public static void main(String[] args) { int [] arr1 = {1,2,3,4,5}; int [] arr2 = null; //正常遍历 printArr(arr1); //接收到一个异常,需要自己处理 //没有处理,交给虚拟机默认处理 printArr(arr2); } private static void printArr(int[] arr) { if(arr == null){ System.out.println("参数不能为null"); //当参数为null的时候,手动创建了一个异常对象 throw new NullPointerException(); }else{ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } } }
Throwable成员方法:
- 格式
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]); } catch (ArrayIndexOutOfBoundsException e) { //catch处理完毕,程序可继续运行 System.out.println("你访问的数组索引不存在"); } } }- 注意
如果 try 中没有异常,会把try中的代码全部执行,不会执行catch里面的代码
如果遇到了异常,跳转到对应的catch语句中,当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码
如果出现的问题没有捕获,那么异常没有处理, 默认交给虚拟机处理.
同时有可能出现多个异常,就写多个catch,如果多个异常之间存在子父类关系,那么父类一定要写在下面。
自定义异常:
- 常用方法
方法名 说明 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]); } catch (ArrayIndexOutOfBoundsException e) { //详细消息字符串 System.out.println(e.getMessage()); //Index 3 out of bounds for length 3 //简短描述 System.out.println(e.toString()); //java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 //错误信息 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) } } }
- 概述
当Java中提供的异常不能满足我们的需求时,我们可以自定义异常
- 实现步骤
定义异常类
写继承关系
提供空参构造
提供带参构造
- 创建异常类
public class 异常类名 extends RuntimeException { public 异常类名() { } public 异常类名 (参数) { super(参数); } }



