异常:
▲异常是一种类且出现在方法体内(包括main方法),不能出现在其他位置。
异常体系:
Error表示严重错误,一般是代码本身的问题。
Exception为狭义的异常,其中RuntimeException为运行时异常,其他为编译时异常。
常见的异常:
RuntimeException运行时异常:
1、空指针异常NullPointerException
引用类型对象为null,输出该对象。
2、数组角标越界异常ArrayIndexOutOfBoundsException
输出数组的第几个元素超过最大元素个数。
3、类型转换异常ClassCastException
4、数值转换异常NumberFormatException
输入数据不是数字格式
5、算术异常ArithmeticException
如 10/0;
异常的处理:
异常的生成和抛出:
1、在方法中出现异常时,如果不进行处理,会在异常代码处生成一个相应异常类的对象并抛出且该方法此后的代码不会继续执行(但是异常代码之前的代码还是会执行)。
2、可以在方法中用手动抛出异常来代替系统自己抛出异常。手动抛出Exception则需要对异常进行捕获处理,RuntimeException则不需要。
格式:throw new Exception/RuntimeException (异常信息message)
▲相当于通过异常类构造器new了一个对象并抛出。
异常的处理(对于RuntimeException运行时异常不要求处理):1、try-catch-(finally);2、throws 异常类型
1、try-catch-(finally)
格式:try{
可能出现异常的代码
}catch(异常类型1 e){
处理1
}catch(异常类型2 e){
处理2
}
….
finally{
一定会执行的代码
}
▲finally是可选的。
▲用try将可能出现异常的代码包起来,若出现异常,从异常代码处直接跳到catch语句中按顺序匹配相应类型并执行(try内异常代码之后的代码不会执行,但是同方法中try-catch-finnally外的代码还会继续执行,因为catch相当于把异常已经处理掉了),并会在跳出catch语句之前执行finally语句。
▲catch语句中,一定把子类异常类型放在父类上面,否则报错。
▲catch执行语句中,常用的异常处理方式为:1、e.getMessage() (message内容为该异常类构造器中的内容);2、e.printStackTrace()
▲try中声明的变量,出了try结构不能调用。
▲finally中的语句是在退出整个try-catch-(finally)语句前最后执行的(即使try中有return或catch中有return或者catch中有新的异常)。
2、throws 异常类型
“throws 异常类型”写在方法声明处,若出现异常就会生成对象并抛给该方法的调用者,异常代码后续不再执行。
▲如果父类被重写的方法没有throws异常,子类重写方法也不能throws异常;当父类被重写方法throws异常后,子类重写方法throws的异常类型不能比父类throws异常类型大。
▲如果有方法调用某个方法时,建议被调用的方法throws异常而不捕获处理(try-catch-(finally)),由调用者来捕获并处理(try-catch-(finally))。
▲main方法中是捕获并处理异常的最后机会,若再throws会导致程序出错。
自定义异常类:
格式:class 自定义异常类 extends Exception/RuntimeException