接下节:day050:try...catch...常见问题、throwable的成员方法、自定义异常_ZQyyds:)的博客-CSDN博客
一、异常
1.什么是异常?
指程序出现了不正常的情况,程序在执行过程中,出现的非正常情况,最终会导致JVM的非正常停止。
注:语法错误不属于异常体系中。(例如关键字大小写出错)
2.异常体系
运行时异常:例如空指针异常、数组索引越界异常等
编译时异常:例如日期格式化异常、解析异常等
3.编译时异常与运行时异常
- 编译时异常:是指在编译成class文件时必须要处理的异常,也称为受检异常
- 运行时异常:是指在编译成class文件不需要处理,在运行字节码文件时可能出现的异常,也成为非受检异常
4.JVM默认处理异常的方式(异常的第一种处理方式)
- 把异常的名称、异常原因以及异常出现的位置等信息输出在控制台
- 将程序停止运行,哪里有异常就在哪里停止
5.throws 异常类名; :
throws 异常类名;
写在方法的定义处(小括号与大括号之间),表示声明一个异常。告诉调用者,如果调用这个方法,可能会出现xx异常,如果该方法没出现异常,则程序正常运行,若出现异常,则将该异常交给调用者处理。
public class exceDemo_01 {
//使用throws声明异常
public static void main(String[] args) throws ArrayIndexOutOfBoundsException {
//交给调用者处理,而main方法的调用者是JVM虚拟机,所以还是会以JVM默认处理异常
extracted();
}
private static void extracted() {
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[10]);
}
}
(注:如果声明的异常是一个运行时异常(例如空指针异常、数组索引越界异常等),则声明的代码可以省略不写,即throws ArrayIndexOutOfBoundsException可以不写;如果声明的异常是一个编译时异常(例如日期格式化异常、解析异常等),则声明的代码必须手动写出)
6.throw抛出异常、异常的第二种处理方式
(1)抛出异常的意义:
- 在方法中,当传递的参数有误,没有继续运行下去的意义了,则采取抛出处理,表示让该方法结束运行
- 告诉调用者方法中出现了问题
代码示例:
public class exceDemo_02 {
public static void main(String[] args) {
// int [] arr={1,2,3,4,5,6};
int[] arr = null;
printArr(arr);//调用者接收异常,再进行处理,若自己没有处理,则继续向上抛给调用者JVM虚拟机
}
private static void printArr(int[] arr) {
if (arr == null) {
throw new NullPointerException();//当参数为null时,手动创建一个异常对象,抛给调用者
} else {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
}
(2)异常的第二种处理方式(try、catch)
格式:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
优点:使用try、catch,即使代码有异常,也可以使代码继续运行下去
代码示例:
public class exceDemo_03 {
public static void main(String[] args) {
// int [] arr={1,2,3,4,5,6};
int[] arr = null;
//使用try...catch...方式处理异常
try {
//可能出现异常的代码
printArr(arr);
}//异常类名,变量名
catch (NullPointerException exception) {
System.out.println("参数不能为null");
}
System.out.println("使用try、catch,代码可以继续运行下去");
}
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]);
}
}
}
}