异常
程序错误分为:
①逻辑问题
②编译问题
③运行时问题
逻辑问题:程序没有按照预期的逻辑顺序执行
编译问题:编译问题多因为程序未遵守正确的语法规则导致的
运行时问题:程序运行过程中出现问题,并导致程序的终止
异常:即程序在运行过程中出现错误时通知调用者的一种机制
处理异常的风格
一般处理异常的风格分为两种:
①以C语言的异常处理方式
②以Java语言的异常处理方式
C语言型的处理方式:
预先进行异常的预测及防范,利用if 进行条件判断并进行处理操作
//伪代码
if(登陆错误) {
登陆错路处理;
return ;
}
这种处理异常的风格也被称为:LBYL风格(Look Before You Leap)在操作之前进行充分的检查
Java语言型的处理方式:
代码不进行异常的预测,发生异常后进行处理操作
try{
账号登陆;
加载界面;
开始游戏;
}catch(账号登陆异常) {
登陆异常处理;
}catch (加载界面异常){
界面异常处理;
}catch (开始异常) {
开始异常处理;
}
这种风格也被称为:EAFP风格(It’s Easier to Ask Forgiveness than Permission)事后获取原谅比事前获取许可更加简单
接下来我们讨论的都是EAFP风格的异常
异常的基本用法
try{
//可能出现异常的代码块
}[catch (异常类型 异常对象){
//对异常进行操作
}]
[finally {
//预防特殊情况,finally内容必定执行
//fianlly内容在最后执行,决定了finally内容有可能造成对catch内容冲相冲突的进行替换,如return 语句
}]
异常处理的流程
①程序先进行try中的代码
②如果try中没有异常出现,也会执行finally中的内容(如果写了finally的话)
③如果出现异常,将会从当前出现异常的语句中跳出到catch语句中
④catch语句中进行try异常类型的匹配操作,如果catch中异常类型不等同于try中抛出异常的类型,将向下一个catch语句中寻找匹配的异常类型catch
⑤如果没有找到匹配的异常类型,就将异常向上传递到上层调用者(上层调用者一般如main 函数中具有func 函数,func函数中书写了try…catch语句,那么main函数中调用func函数的语句就是上层调用者)
⑥无论找没找到相匹配的异常类型,fianlly中的内容一定执行
⑦如果main方法中也没合适的代码处理这个异常的话,就将交给JVM虚拟机继续宁处理,这个时候程序一定异常终止
异常的非try处理方式
抛出异常的方式
LBYL风格中抛出异常
if(异常发生代码) {
throw new 异常类型("异常说明");
//其中异常说明是可以按照自己想表达的含义书写
//throw 关键字 throw的就是一个对象
}
异常说明
在定义方法的时候进行提醒该方法可能存在的异常问题
public int divide(int x,int y) throws ArithmetricException{
if(y == 0) {
throw new ArithmetricException("除数不能为0");
}
return x / y;
}
//throws 关键字就是异常说明关键字,后面接着异常类型
异常的分类
异常的顶层类:Throwable 类,该类派生出 Error 以及 Exception类
这两个派生类又分可以分类为:
①非受查异常
②受查异常
非受查异常包含:Error类 以及 Exception类下的RuntimeException类
受查异常包含:Exception类中的IOException、ClassNotFoundException、CloneNotSupportedException等异常
其中受查异常和非受查异常的主要区别在于:
①受查异常可以进行捕获处理
②非受查异常不能进行手动处理,JVM自动抛出并自动捕获,此类代码多是自身逻辑出现错误