异常
指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
异常的根类是 java.lang.Throwable ,
其下有两个子类:java.lang.Error 与 java.lang.Exception
1.Throwable体系:
a).Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
b).Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑
尾炎。
2.Throwable中的常用方法:
a).public void printStackTrace() :打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和
调试阶段,都得使用printStackTrace。
b).public String getMessage() :获取发生异常的原因。提示给用户的时候,就提示错误原因。
3.异常(Exception)的分类:根据在编译时期还是运行时期去检查异常
a).编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
b).运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。
4.异常产生的过程解析
1).JVM执行到有异常的代码;
2).JVM要识别出这种异常;
3).JVM到类库中找到描述这个异常的“异常类”,并创建对象;
4).判断我们的代码中是否希望“捕获这种异常”:
是:去执行“捕获异常的代码”;
否:在控制台打印异常信息,并结束程序(这是我们不希望看到的)
异常的处理
Java异常处理的五个关键字:try、catch、finally、throw、throws
1.方法内抛出异常throw
定义的方法,如需要接收参数,首先应对参数做判断是否合法,如果不合法告知调用处发生异常,那么就需要用到‘’
throw抛出异常
使用:创建一个异常对象。封装一些提示信息(信息可以自己编写)。通过throw抛给调用者
格式:throw new 异常类名(参数); throw用在方法内,用来抛出一个异常对象
例如:throw new NullPointerException("要访问的arr数组不存在");
注意:如果throw抛出的是一个“运行期异常”,调用处可以不处理;如果不处理,报错程序退出。如果throw抛出了一
个“编译期异常”,方法声明处必须显示的使用throws声明此异常,并且调用处也必须处理(try..catch或者继续throws出
去),否则编译错误;
2.捕获异常try…catch
用来捕获异常,try里执行可能发生异常的代码,cathc里执行捕获异常信息。
3.try...catch...catch语句
不确定异常类型,可以catch多个异常类型
注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。(比如:Exception异常应该写在下面的catch)
4.声明抛出异常throws
如果方法内通过throw抛出了编译时异常,那么必须通过throws进行声明,让调用者去处理。关键字throws运用于方法声明之上
注意:如果throws后面的是“编译期异常”,调用的代码必须要使用try...catch...或者继续抛出,否则编译错误。如果throws后面的是“运行时异常”,调用处可以不处理,编译可以通过,但不建议。
5.异常的处理_try...catch...finally语句
处理一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到的问题
如果try或者catch里有return语句,return先执行一般,执行finally里的代码,再继续执行完return
6.常见异常:
1).空指针异常:NullPointerException(运行时异常)
2).数组下标越界异常:ArrayIndexOutOfBoundsException(运行时异常)
3).数字转换异常:NumberFormatException(运行时异常)
4).算术运算异常:ArithmeticException(运行时异常)
5).转换异常:ParseException(编译期异常)--必须要捕获,否则编译错误
7.Objects类的非空判断
public static <T> T requireNonNull(T obj) :查看指定引用对象不是null。
方法源码做了判断,如果为null抛出异常,调用这个方法可以不用自己写抛异常
自定义异常
在开发中根据自己业务的异常情况来定义异常类.
异常类如何定义:
1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。
2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException
然后像使用类库中的异常类一样使用
示例:
1).定义异常类:
public class AgeException extends Exception{
public AgeException(String msg) {
super(msg);
}
}
2).使用异常类:
public class Student {
private int age;
public void setAge(int age) throws AgeException {
if (age < 15 || age > 50) {
throw new AgeException("年龄错误,必须在15到50岁之间!");
}
this.age = age;
}
}
3).测试代码:
public class Demo {
public static void main(String[] args) {
Student stu = new Student();
try {
stu.setAge(100);
} catch (AgeException e) {
System.out.println("异常信息:" + e.getMessage());
}
}
}