1.概述
Java通过面向对象思想将问题封装成对象,用异常类对其进行描述。
2.体系
a. 问题有很多,因此有很多类进行描述。将其共性向上抽取,形成异常体系。
b.异常分为 不可处理异常 Error 和可处理异常 Exception ,都继承自 接口 Throwable
3.原理、异常对象的抛出throw
a.当程序违反了Java语法规则时,Java虚拟机就会将发生的错误表示为一个异常,并抛出到控制台,这属于Java类库内置的语义检查
b.异常对象的抛出throw
代码示例:
class Demo{
public int method(int[] arr,int index){
if(index>=arr.length){
throw new ArrayIndexOutOfBoundsException("数组越界异常,角标为:"+index);//抛出异常对象并对异常内容进行自定义
}
if(index<arr.length){
throw new ArrayIndexOutOfBoundsException("数组角标不能为负数,角标为:"+index);
}
if(arr==null){
throw new NullPointerException("数组不能为空");
}
return arr[index];
}
}
public class ExceptionDemo {
public static void main(String[] args){
int[] arr=new int[3];
Demo d=new Demo();
int num=d.method(null,3);
System.out.println("num="+num);
}
}
4.自定义异常、异常类的抛出throws
a.自定义异常:Java语序程序员扩展这种语义检查,可以自定义异常并自由选择在何时用throw关键字引发异常
b.如果让一个类成为异常类,必须要继承异常体系(Exception或RuntimeException),因为只有称为异常体系的子类才具备可抛性
代码示例:
class FushuIndexException extends Exception {//自定义异常类
FushuIndexException(String msg) {
super(msg);
}
}
class Demo {
public int method(int[] arr, int index) throws FushuIndexException {
if (index < arr.length) {
throw new FushuIndexException("数组角标不能为负数,角标为:" + index);
}
return arr[index];
}
}
public class ExceptionDemo {
public static void main(String[] args) throws FushuIndexException {
int[] arr = new int[3];
Demo d = new Demo();
int num = d.method(arr, -1);
System.out.println("num=" + num);
}
}
5.编译时异常和运行时异常&throws和throws的区别
a.编译时异常和运行时异常:
编译时异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系,这种问题有对应的处理方式并进行针对性处理。
运行时异常:Exception中的RuntimeException和其子类,这种问题无法让功能继续,算法无法进行,运行时强制停止程序
b.throws和throw的区别
使用位置不同:throws使用在函数头上,throw使用在函数内部
抛出内容不同:throws抛出的是异常类,可抛出多个,用逗号隔开;throw抛出的是异常对象,只能是一个
6.异常捕捉trycatch
a.异常处理的捕捉形式:这是可以对异常进行针对性处理的方式
b.具体格式:
try{
//需要被检测异常的代码
}
catch(异常类 变量){//该变量用于接收发生的异常对象
//处理异常的代码
}
finally{
//一定会被执行的代码
}
c.代码示例:
int[] arr = new int[3];
Demo d = new Demo();
try {
int num = d.method(arr, -30);
System.out.println("num=" + num);
} catch (FushuIndexException f) {
System.out.println("负数角标异常");//解决问题后程序继续运行
}
System.out.println("over");
7.多catch情况
代码示例:
try {
int num = d.method(arr, -30);
System.out.println("num=" + num);
} catch (NullPointerException e) {//catch1
System.out.println(e.toString());
} catch (FushuIndexException e) {//catch2
System.out.println("负数角标异常");// 解决问题后程序继续运行
}
8.异常处理原则
a.函数内部如果抛出需要检测的异常,则函数上必须声明;否则必须在函数内用trycatch捕捉,否则编译失败。
b.如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。
c.什么时候用catch,什么时候用throws? 功能内容可以解决用catch,功能解决不了用throws告诉调用者,由调用者解决。
d.一个功能如果抛出多个异常,那么调用时,必须由对应多个catch进行针对性处理。
9.finally代码块
finally{//通常用于关闭(释放)资源
System.out.println("finally");
}
10.注意事项
a.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
b.如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
c.父类如果没抛出异常,子类一定不能抛出异常,只能try。