1. 异常概念:
是指在编译或者运行期间,发生不正确的事件。
2. 体系结构:
编译时异常:
打代码打的不正确时,会告诉你错误
运行时异常:
还能通过编译,运行的时候会报错
比如:
(1)NullPointerException: 空指针异常,对象没有实例化(new)而直接使用
(2)ArithmeticException: 算术异常,在算术过程中发送的异常比如除数为0
(3)ArrayIndexOutOfBoundsException: 数组下标越界异常,数组下标超出范围
IndexOutOfBoundsException: 下标越界异常,集合下标越界
StringIndexOutOfBoundsException: 字符串下标越界异常
(4)ClassCastException: 类型转换异常,强制类型转换的时候类型不匹配
3. 处理:
try catch:
/**
①
try{
//可能出现异常的代码
} catch(认为可以处理该异常的类型 对象) {
//提供处理方式
}
②
try-catch-finally 代码直接处理异常
try{
...... //可能产生异常的代码
} catch( ExceptionName1 e ){
...... //异常的处理代码
} catch( ExceptionName2 e ){
...... //异常的处理代码
} finally{
...... //无论如何都会执行的语句
}
③
注意:
try:
如果确定不会发生异常的代码,不要放在try里面。因为try里面的代码,系统逐行判断异常,效率低
catch:
可以提供多个catch,依次从上到下判断,找到可以处理的异常方案
如果多个catch具有父子关系,要求上面的catch范围要小
jkd5以后,运行多个catch同时判断
finally:
表示最终的,无论是否发生异常,无论是否捕获到异常,都会被执行
可有可无,根据需要
*/
try{
//可能出现异常的代码
} catch(认为可以处理该异常的类型 对象) {
//提供处理方式
}
throw:
自定义异常类,比较常用
/**
使用方法抛出异常,给调用方法的人以提示。
*/
//自定义异常:①继承Exception
public class LowerMoneyException extends Exception{
private static final long serialVersionUID = 1L; //标记,可以不写
//② 在构造方法中调用父类构造方法,指定异常信息
public LowerMoneyException() {
super("发送异常:余额不足");
}
}
//实体类
public class Card {
private int money; //余额
public Card(int money) {
super();
this.money = money;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
@Override
public String toString() {
return "Card [money=" + money + "]";
}
public void quQian(int qian) throws LowerMoneyException { //② 方法接着抛异常
if (money < qian) { //当逻辑错误的时候
//抛出自定义异常
LowerMoneyException e = new LowerMoneyException();
//① 手动抛出异常
throw e;
}
money -= qian; //不用写else
}
}
//测试类
public class Test {
public static void main(String[] args) {
Card card = new Card(1);
//取钱
try {
card.quQian(1000);
} catch (LowerMoneyException e) {
e.printStackTrace();
}
//测试余额
System.out.println(card);
}
}