异常
一、概念【理解即可】
1.
异常:程序运行过程中,出现的非正常情况。
2.
异常的处理:当异常出现时,执行一段预先准备好的代码。
3.
异常的处理的必要性:减少用户的损失、同时减小给用户带来麻烦,也可以对用户做一些提示信息。
二、异常的分类 【面试重点】
1. Throwable
:
Java
语言中所有错误或是异常的父类,位于
java.lang
包中
(1) String getMessage()
:获取字符串类型异常信息。
//
用于给用户展示提示信息
(2) void printStackTrace()
:打印输出方法调用过程中产生详细异常信息。
//
编程人员用于调试程序
2.
子类
Error
:是
Throwable
的子类,代表错误
注意:
Error
代表仅靠程序本身无法恢复的严重的错误,例如
JVM
内存不足,或是方法调用过程中栈溢出等。
例如:
java.lang.StackOverflowError(
递归导致的栈溢出
)
3.
子类
Exception
:是
Throwable
的子类,代表异常
(1) RuntimeException
:运行时异常、未检查异常,与
RuntimeException
有直接或是间接继承关系的异常类
a.
特点:编译器不会检测此类异常,运行的时候报错。
b.
处理:可处理,可不处理
(
严谨代码
)
,此类异常可以避免。
c.
常见的运行时异常:
①
java.lang.ArrayIndexOutOfBoundsException
:下标越界
②
java.lang.NullPointerException
:空指针异常
③
java.lang.ClassCastException
:类型转换异常
④
java.lang.NumberFormatException
:数字格式转换异常
(2)
非
RuntimeException
:非运行时异常、已检查异常,与
RuntimeException
没有任何的继承关系的异常类
a.
特点:编译器检测此类异常,编译的时候报的错误。
b.
处理:此类异常必须处理。
c.
案例:
Class.forName("day1.TestStudent"); //
非运行时异常, 区分于语法错误
三、异常的产生
1.
自动产生异常:
(1)
产生原因:程序在运行过程中,遇到错误的代码,自动产生异常
(2)
结果:程序中一旦遇到异常,则被终止,不能继续执行异常之后的代码。
2.
手动产生异常【开发重点】
(1)
关键字:
throw
(2)
语法:
throw new
异常类类名
("
异常信息
");
(3)
位置:必须定义在方法内部
(4)
结果:相当于
return ;
终止、结束当前程序,程序会因异常而被终止。
四、异常的传递【理解即可】
1. Java
中的异常沿着方法的调用链进行反方向传递,最终传递给
JVM
,程序因被终止。
五、异常的处理【开发重点】
1.
消极处理异常
(
声明异常
)
(1)
关键字:
throws
(2)
位置:在方法声明的位置,进行消极处理异常
(3)
语法:修饰符
返回值类型 方法名
(
形参列表
)throws
异常类名
1,
异常类名
2,
异常类名
3{}
(4)
结果:消极处理异常只是推卸责任,程序还是会因异常而被终止。
(5)
作用:消极处理异常可以让非运行时异常在编译阶段通过。
(6)
注意:消极处理异常时可以 利用父类型处理其子类型的异常。
2.
积极处理异常
(
捕获异常
)
(1)
语法:
try{
//
可能出现异常的语句
}catch(
异常类名
e){
//
异常出现时需要执行的语句
}
(2)
注意:
a. try
后面可以定义多个
catch
结构,一旦
try
出现异常,则从第一个
catch
,从上往下依次进行匹配。
b. catch
可以利用父类型处理本类型
+
所有子类型的异常,多态技术的应用。
c.
定义子类的
catch
需要 写在 定义其父类型的
catch
结构前面
d. catch
中只能捕获
try
可能出现的非运行时异常;但是
catch
中可以处理任意运行时异常,不管
try
中有没
有可能出现此类异常
(3) finally
的应用:
a.
语法:
try{
//
可能出现异常的语句
}catch(
异常类名
e){
//
异常出现时,执行的语句
}finally{
//
不管有没有异常,都必须执行的语句
}
b. finally
的应用:开发时不建议将
return
语句定义在
finally
中,通常
finally
中用于关闭资源。
c.
常见的结构:
try{}catch(){}
try{}catch(){}catch(){}
try{}catch(){}finally{}
try{}catch(){}catch(){}finally{}
try{}finally{} //
只是为了一些语句被执行
try{ try{}catch(){} }catch(){}
try{}catch(){ try{}catch(){} }
try{}catch(){}finally{ try{}catch(){} }
注意:
try
后面可以跟多个
catch
,但是最多只能有一个
finally
try
后面至少有一个
catch
或是
finally
六、自定义异常
1.
类继承
Exception
或是其子类,如果类继承了
RuntimeException
或是
RuntimeException
的子类,则抛出的异常
为运行时异常
2.
提供两个构造方法:
(1)
一个无参数的构造方法
(2)
带有
String
类型参数的构造方法,借助
super()
为父类
Throwable
异常信息属性赋值
public
类名
(String message){
super(message);
}
七、方法覆盖【终结版】【面试
+
开发重点】
1.
子类的方法名、形参列表、返回值类型和父类相同
2.
子类的方法的访问修饰符和父类相同或是更宽
3.
子类不能抛