一 异常
异于正常状态的显示,即控制台显示结果与预期的不一致
// 抛出异常java.lang.ArrayIndexOutOfBoundsException
int[] nums = new int[2];
System.out.print(nums[2]);
二 异常分类
1 检测性异常:有称为非运行时异常,一般是在编写代码的过程中编程软件直接报错
2 非检测性异常:也称运行时异常,java为运行时异常单独封装一个类 – RuntimeException类;是编写代码过程中没问题,但执行并没有获取到预期结果
三 异常类的类结构
1 对于异常信息的解释越详细,异常类的名越长
2 异常类名分为两部分,Exception前:表示对当前异常出现的详细描述,Exception:表示当前类属于是异常类
3 常见异常解析
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at com.play.Play.main(Big.java:12)
Exception:表示当前代码存在异常
in thread “main” :在主线程中
java.long.异常名:当前出现的是什么异常
:值 – 对当前异常是因为什么原因出现的
at…:表示异常出现的代码行数,一定要看at单词后地址是由我们自己定义的
特点:当一旦出现异常,则其后定义的所有代码不会被执行
四 异常处理机制
1 机制:按照java中规定好的指定规则,完成对数据或业务的指定处理,这种操作就叫机制
2 分类
① 处理异常(常用):由作者主动处理(后期可交给Spring框架完成处理)
② 抛出异常:将异常向上抛出,谁调用,谁处理
3 处理异常
// 语法格式
try{
捕获异常:编写可能出现异常的代码
}catch(异常类1 对象1){
处理异常:完成对指定异常的处理操作
}catch(异常类2 对象2){
处理异常:完成对指定异常的处理操作
}
finally{
编写无论是否出现异常都要执行的代码,一般编写关闭资源的代码
}
// 例子
public class Play {
public static void main(String[] args) {
int[] nums = new int[0];
try {
nums = new int[2];
System.out.print(nums[2]);
} catch (Exception e) {
System.err.println("error");
} finally {
System.err.println("ok");
}
}
}
4 执行原则
当在try块中捕获异常后,则马上执行catch块中的内容,try块中后续的内容都不执行,当catch块执行后,在执行finally;如果try块中没有捕获异常,执行完try块中所有的内容后执行finally块中的代码
5 执行特点
① 组合操作
try , catch ,finally 可以组合出现
try , catch 可以组合出现
try , finally 可以组合出现
catch , finally 不能组合出现
② 在这三个代码块中间不能编写任何代码,即这三个代码块必须紧密相连
③ try , catch, finally可以嵌套但很少这样使用
④ 当编写多个catch块时,有编写顺序和执行顺序
catch 块既有编写顺序也有执行顺序;必须是按照异常的详细程度,越详细需要编写在前面;只会执行最匹配的catch块,完成处理
⑤ 打印当前异常信息
public class Play {
public static void main(String[] args) {
int[] nums = new int[0];
try {
nums = new int[2];
System.out.print(nums[2]);
} catch (Exception e) {
// 打印异常信息
e.printStackTrace();
} finally {
System.err.println("ok");
}
}
}
java是多线程的编程语言,会随机执行操作,处理异常后,执行的操作结果显示位置有时会不一致
6 抛出异常
① throws:抛出一个或多个异常类,定义的位置在参数列表后面,多个异常的时候用 “,” 隔开
② throw:抛出指定的某一个异常类对象,定义的位置在方法体中
public class Play {
public static void main(String[] args) {
Integer flag=1;
try {
if(flag==1){
// 抛出异常
throw new RuntimeException("这个是运行时错误");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.err.println("dw");
fun();
}
}
// 异常声明 谁调用谁解决
public static void fun() throws RuntimeException,ArrayIndexOutOfBoundsException{
System.err.println(1/0);
}
}
7 java中异常处理机制
①分两种处理方式:处理异常和抛出异常
②通过try块进行异常的捕获,通过catch块对指定的异常进行处理,在finally中去执行无论是否出现异常都要执行的代码
8 final和finally关键字与finalize方法
① 相同点:都是修饰符,都表示最终的含义
② 不同点 : 修饰的内容不同
③ final:能够修饰类(不能被继承),成员字段(必须有初始值),成员方法(不能被重写)
④ finally:能够修饰代码块,表示无论是否出现异常都要执行的操作
⑤ finalize:Java中的一个方法名。Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的
五 自定义异常类
根据自己业务的异常情况来定义异常类
// 定义除数不能为0的异常类
public class DIYException extends Exception{
// 通过构造器完成异常类的信息展示
public DIYException(String message){
// 调用父类构造器完成参数传递
}
}
使用自定义的异常类
// 使用自定义的异常类
public class UseException {
public double div(double num1,double num2)throws DIYException{
// 满足条件会抛出指定异常信息
if(num2 == 0){
throw new DIYException("除数不能为0");
}
return num1/num2;
}
}
测试类进行测试
// 测试类
public class Test {
public static void main(String[] args) {
UseException ue = new UseException();
try {
// 有异常声明的类需要进行try catch
System.err.println(ue.div(1,0));
} catch (DIYException e) {
e.printStackTrace();
}
}
}