异常
异常
1.异常的介绍和分类
1.概述:代码不正常,在java中其实是一个一个的类
2.之前见过的异常:
NullPointerException
ArrayIndexOutOfBoundsException
ClassCastException
3.异常分类
2.异常的处理方式
1.throws
1.格式:参数后面,方法的大括号前面
throws 异常对象
抛多个异常
1.格式:
throws 异常对象,异常对象...
2.注意:
a.如果方法中同时有多个异常,并且多个异常之间有子父类继承关系,先抛小的,再抛大的
b.如果方法中的多个异常,我们不知道到底是不是子父类继承关系,我们可以直接抛Exception
2.try...catch
扑获异常
1.格式
try{
可能出现异常的代码
}catch(异常对象 对象名字){
处理异常的方案->打印异常信息->将异常信息扔到日志文件中
}
2.注意:
catch要准确,如果catch不到异常,相当于没有处理,没有处理,就会给jvm,jvm直接结束程序
1.格式:
try{
可能出现的异常代码
}catch(异常对象 对象名){
处理异常的方案->打印异常信息->将异常信息扔到日志文件中
}catch(异常对象 对象名){
处理异常的方案->打印异常信息->将异常信息扔到日志文件中
}catch(异常对象 对象名){
处理异常的方案->打印异常信息->将异常信息扔到日志文件中
}catch(异常对象 对象名){
处理异常的方案->打印异常信息->将异常信息扔到日志文件中
}...
2.注意:
a.如果捕获的多个异常之间,有子父类继承关系,先抓小的,再抓大的异常
b.如果咱们捕获多个异常时,不知道多个异常之间是否有子父类继承关系,我们可以直接抓大的,或者直接抓Exception
3.finally关键字
1.概述:finally中的代码是一定会执行的
2.格式:
try{
可能出现异常的代码
}catch(异常对象 对象名字){
处理异常的方案->打印异常信息->将异常信息扔到日志文件中
}finally{
一定会执行的代码
}
public class Demo08Exception {
public static void main(String[] args) {
int result = method();
System.out.println(result);
}
public static int method() {
try {
String s = null;
System.out.println(s.length());//空指针异常
return 2;
} catch (Exception e) {
return 1;
} finally {
System.out.println("我一定要执行");
//return 3;
}
}
}
我一定要执行
1
如果finally中加上return 3 执行结果为:
我一定要执行
3
使用场景
关闭资源用:
像IO流,Socket(网编),数据库连接对象,GC是回收不了的,所以当我们用这些gc回收不了的对象之后,需要手动关闭,所有这些对象使用成不成功都要手动关闭,所以手动关闭的代码就可以放到finally中
4.抛异常的注意事项
1.父类中的方法抛异常了,子类重写之后要不要抛?
可抛可不抛
2.父类中的方法没有抛异常,子类重写之后要不要抛?
不要抛
5.使用时机
1.如果处理异常之后,还想让后续的代码正常执行,我们使用try...catch
2.如果方法之间是递进关系(调用),我们可以先throws,但是到了最后需要用try...catch做一个统一的异常处理
快速处理异常方式:
1.如果遇到编译时期异常:直接alt+回车
2.如果遇到运行时期异常需要处理:选中->ctrl+alt+t
6.打印异常的三个方法
1.Throwable中的方法:
public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误信息)
public String toString():获取异常的类型和异常描述信息(不用)
public void printStackTrace():打印异常的跟踪栈信息并输出到控制台上(最详细的异常信息)