文章目录
- 10.22
- 异常
- 异常类层次结构
- Error
- Exception
- 分类
- 运行时异常(非检查异常)
- 非运行时异常(检查异常)
- 异常捕获处理
- throw关键字
- 作用
- 使用格式
- 注意事项:
10.22
异常
异常类层次结构
java 中,异常被当做对象来处理,所有异常的顶层父类都是 java.lang.Throwable 类。
所有的异常又被分为两大类: Error 和 Exception 。
Error
代表了 Java 自身的那些不能被工程师处理的错误,比如内存耗尽、系统崩溃,这是一种人力所无法预见和掌控的因素,这类错误在 Java 中很少出现。
Exception
表示程序运行时各种可能发生的非正常事件,可以被捕获、抛出和处理,这是 Java 异常处理的核心。
分类
运行时异常(非检查异常)
运行时异常( RuntimeException ),也称非检查异常( Unchecked Exception )。包括 Error 和 RuntimeException 及其它们的子类。
Java 在编译源代码时,不会提示和发现这样的异常。所以这种异常的出现,几乎可以肯定就是代码写的有问题。
非运行时异常(检查异常)
检查异常( Checked Exception ):除了 Error 和 RuntimeException 之外所有的其它异常。
Java 强制要求工程师处理这类异常(也就是用特定的语法 try…catch…finally 捕获并处理这类异常)。
异常捕获处理
以这段代码为例。
package com.xxm.task4;
public class test4 {
public static void main(String[] args) {
int arr[] = {1, 2, 3};
int num = getElement(arr, 3);
System.out.println(num);
}
public static int getElement(int[] arr, int index) {
int ele = arr[index];
return ele;
}
}
在这段代码中,getElement 方法可以返回数组某个索引指向的值。
main 方法中传入的参数为 3,数组只有 3 个元素,访问索引 3 对应的值会造成越界。
在实际运行中,情况是这样的:
-
main
方法是入口 - 在主方法中调用
getElement
方法 - 在
getElement
方法中访问 arr[3],产生异常对象:索引越界。 - 在
getElement
方法中寻找异常处理逻辑,找不到,于是 JVM 把这个异常对象抛出给getElement
方法的调用者——main
方法。 -
main
方法中也没有处理该异常对象的逻辑,于是继续把这个异常对象抛出给main
方法的调用者——JVM。 - JVM 接收到了这个异常对象,JVM 对异常处理的逻辑,让JVM做出两件事:
- 把异常对象(内容、原因、位置)以红色字体打印在控制台;
- 中断当前正在执行的 java 程序。
这也就是为什么平时运行程序时,如果有错误会有红色报错提示,并且程序终止了。
throw关键字
作用
throw
关键字可以在指定的方法中抛出指定的异常
使用格式
throw new xxxException(“异常原因”)
注意事项:
-
throw
关键字必须写在方法的内部 -
throw
关键字后 new 的对象必须是Exception
类或者Exception
类的子类对象 throw
关键字抛出指定的异常对象,就必须处理它
- 如果
throw
关键字创建的是 RuntimeException 或者是 RuntimeException 子类的对象,可以不处理,默认交给 JVM 处理(打印异常 + 中断程序)。 - 如果
throw
关键字创建的是编译异常,就必须处理这个异常,使用throws
或try ... catch