理解java中的异常
异常:异常指的就是程序在 运行时 出现错误时通知调用者的一种机制.不包含编译过程的异常
常见的主要有三种:除以 0、数组下标越界、访问 null 对象
1、常见异常
- 除 0 异常
- 空指针异常
通过null调用成员方法或属性 - 数组下标越界异常
2、避免异常的两种处理(防御式编程)
2.1 LBYL:在操作之前就做充分的检查.
LBYL 风格的代码(不使用异常)
boolean ret = false;
ret = 登陆游戏();
if (!ret) {
处理登陆游戏错误;
return;
}
ret = 开始匹配();
if (!ret) {
处理匹配错误;
return;
}
ret = 游戏确认();
if (!ret) {
处理游戏确认错误;
return;
}
ret = 选择英雄();
if (!ret) {
处理选择英雄错误;
return; }
ret = 载入游戏画面();
if (!ret) {
处理载入游戏错误;
return; }
......
2.2 EAFP:先操作, 遇到问题再处理.
try {
登陆游戏();
开始匹配();
游戏确认();
选择英雄();
载入游戏画面();
...
} catch (登陆游戏异常) {
处理登陆游戏异常;
} catch (开始匹配异常) {
处理开始匹配异常;
} catch (游戏确认异常) {
处理游戏确认异常;
} catch (选择英雄异常) {
处理选择英雄异常;
} catch (载入游戏画面异常) {
处理载入游戏画面异常; }
......
3、异常的基本语法
3.1 捕获异常
基本语法:
-
数组越界异常
-
空指针异常
此时有多个catch可不捕获多种异常 -
假设此时可能出现10种异常,若写10种很麻烦,可用向上转型,使用异常的共同父类Exception来捕获异常,不太推荐,一般明确知道会产生那种异常就捕获那种异常,方便排查问题
关于异常的错误输出
在java中,一切皆对象,上面的空指针、数组越界、Exception ——> 都是异常 类 当产生错误时,JVM会构造一个相应的异常对象传递给程序
catch(ArrayIndexOutOfBoundsException e)中的e就是异常对象,由JVM产生传递给catch代码段
e.printStackTrace();打印错误的堆栈信息 错误开始的位置
int[] arr={10,20,30};
// 将可能报错的代码放在try中,并用catch捕获
try{
System.out.println(arr[10]);
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界");
e.printStackTrace();
}
3.2 异常的返回值问题
一旦finally中带了返回值,相当于try和catch中的返回值就失效了,无论异常发生与否,finally一定执行,因此会覆盖try和catch的返回值。
在finally中一般不推荐写返回值,除非返回值与异常无关,默认返回值可放在finally中
3.3 关于异常的调用链
异常会随着调用链向上传递,直到有一处捕获异常并处理为止。若调用过程都没有异常,最终会将异常抛给JVM,此时程序终止。
3.4一组关键字:throws throw
throws:用在方法声明上明确表示该方法有可能产生异常,但不处理,抛回给调用者处理
throw:用在方法内部,表示认为产生异常对象并抛出
在学习数据结构写栈等结构时,若栈为空,调用取出栈元素方法就可以使用throw手工抛出异常,告诉调用者栈为空,无法操作。