异常:
什么是异常?
异常是程序在“编译”或者“运行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。
比如:数组角标越界、空指针异常,日期格式化异常……
为什么要学习异常?
、异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止
研究异常并且避免异常,然后提前处理异常,体现的是程序的安全,健壮性
异常体系:
Error:
系统级别问题、JVM退出等,代码无法控制
Exception:java.lang包下称为异常类,它表示程序本身可以处理的问题
RuntimeException及其子类:运行时异常,编译阶段不会报错,(空指针异常,数组索引越界异常)
除RuntimeException 之外所有的异常:编译期必须处理的,否则程序不能通过编译(日期格式化异常)
运行时异常
直接继承自RuntimeException或者其子类,编译阶段是不会报错,运行时可能出现的报错
运行时异常示例
数组索引越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException直接输出没有问题,但是调用空指针的变量的功能就会报错
数字操作异常:ArlthmeticException
类型转换异常:ClassCastException
数字转换异常:NumberFormatException
编译是异常的特点:
编译时异常:继承自Exception的异常或者其子类
编译阶段报错,必须处理,否则代码不通过
默认处理异常机制,会引起程序死亡
编译时异常处理的三种形式:
出现异常直接抛出去给调用者,调用者也继续抛出去
出现异常自己捕获处理,不麻烦别人
前两者结合,出现异常直接抛出去给调用者,调用者捕获处理
异常处理方式1——throws
Throws:用在方法上,可以将方法内部出现的异常抛出去给调用本方法发调用者处理
这种方法并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡
抛出异常格式:
方法 throws 异常1,异常2,异常3……{
}
规范做法:
方法 throws Exception{
}
异常处理方式2——try…catch…
监视捕获异常,用在方法内部,可以将方法内部出现的异常自己捕获处理
这种方法还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行
格式:try{
}catch(异常类型1 变量){
} catch(异常类型2 变量){
}
建议格式:
try{
}catch(Exception e){
e.printStackTrace();
}
Exception 可以捕获处理一切异常类型!
异常处理方法3——前两者结合
方法直接将异常通过throws抛出去给调用者
调用者收到异常后直接捕获处理
异常处理总结:
在开发中按照规范来说第三种方式是最好的,底层的异常抛出去给最外层,最外层集中获取处理
实际应用中,只要代码能够编译通过,并且功能能完成,那么每一个异常处理方式似乎也是可以的
运行时异常的处理方式:
运行时异常编译阶段不会出错,是运行时才可能出错的,使用编译阶段不处理也可以
按照规范建议还是处理:建议在最外层调用处集中捕获处理即可
自定义异常的必要?
Java无法为中国世界上全部的问题提供异常类
如果企业想通过异常的方式来管理业务问题,如提醒程序员注意
同时一旦出现bug,可以用异常的形式清晰的指出出错的地方
自定义异常分类
1.自定义编译是异常:
定义一个异常类继承Exception
重写构造器
在出现异常的地方用throw new 自定义对象抛出
作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理
2、自定义运行时异常
定义一个异常类继承RuntimeException
重写构造器
在出现异常的地方用throw new自定义对象抛出
作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!
###
学习过程中的一些小笔记,有问题可以帮忙纠正一下,欢迎一起讨论!!~
###