一、异常
为什么学习异常?
程序员在开发中,会遇到异常BUG,JVM会终止程序,带来体验不好
学习异常的目的
学习异常,有助于帮助开发者能够更好的解决遇到的问题,就算异常了,程序会继续执行下去,并且告诉我们程序哪里出错了。
1、概念
指程序在执行过程中,出现非正常的情况,最终会导致JVM的非正常停止。
异常是一个类,产生异常就是创建异常对象并抛出一个异常对象
java处理异常的方法是中断处理;
2、异常体系结构图
Throwable父类异常
Error 严重错误:如内存溢出、JVM错误、线程死锁等,程序员无法解决,不做处理
Exception:程序员能够处理
RuntimeException 运行时异常
IOException 输入输出异常
![]()
3、异常的分类
编译时异常 Checked异常 受检异常
ParseException
运行时异常 非受检异常(RuntimeException)
//算术异常ArithmeticException: / by zero
int num1 = 10;
int num2 = 0;
System.out.println(num1/num2);
//数组越界异常ArrayIndexOutOfBoundsException
int[] arr = new int[3];
System.out.println(arr[3]);
//类型转换异常ClassCastException
Object obj = 10;
String str = (String)obj;
//空指针异常NullPointerException
String s =null;
System.out.println(s.equals("hello"));
4、处理异常(两种方法)
使用异常机制:try-catch、try-catch-finally、try-finally
1、语法格式:
书写多重catch块,子类不能放在父类后面,先子类 后父类异常
try{
有可能出异常的代码
}catch(异常类型 异常名){
出错了,匹配异常
异常名.printStackTrace();//打印异常堆栈信息的方法
异常名.getMessage();//打印错误信息
}
2、匹配顺序:
try块里面的代码没有出错,则不会执行catch块,继续执行后面的代码
try块里面的代码出错,匹配catch异常,匹配异常成功,则执行catch块,后面的代码可以继续执行;匹配异常不成功,异常则不会正常的处理,系统直接终止程序,后面的代码会受影响;
finally关键字
1、语法格式
try{
放可能出现异常的代码
}catch(Exception e){
e.printStackTrace();
异常匹配处理
}finally{
//不管try块有没有发生异常,最终一定都会执行的代码块
//唯一不执行finally的方法,使用系统退出的方法
//System.exit(0)表示正常终止,System.exit(-1)非0代表异常终止 }
2、注意事项
return关键字在异常处理的时候,在try块或者catch块遇到return不会影响finally块的代码的执行,
3、执行流程:加入return关键字
首先在try块发生异常
进到catch块捕获异常
匹配成功,打印异常信息
遇到return
再执行finally块
最后再return返回值
final、finally、finalize的区别
final代表最终的,不能被修改,修饰属性和方法和类;
finally代表try-catch-finally异常里面最终一定会执行的代码块;
finalize是系统使用的方法,当堆区中存在没有引用的空对象,系统会调用垃圾回收器调用此方法;是Object类提供的方法
4、throws & throw
throws:抛多个异常类,在方法的声明上,代表有可能会出现异常
throw:只能new一个,在方法体内,代表一定会出现异常
throws:抛出异常给到调用者来进行处理,谁调用谁就来处理
在方法的声明上定义的异常,可以定义多个异常,以逗号隔开,代表把异常抛给调用者来处理
抛的是编译时异常,在编写程序的时候,就告诉调用者一定要处理
抛得是运行时异常,在程序运行时,控制台显示异常
异常两种方法处理:
继续抛给别人处理Throw & Throws
自己处理try-catch-finally
5、自定义异常
自定义异常步骤
新建一个类
继承异常(Exception 编译时异常、RuntimeException 运行时异常)
通过调用父类的构造方法,构建异常