1.0版本异常体系,什么是异常
异常处理方式
1.throw 手动抛出一个异常,这个异常对象需要我们手动创建
格式: throw new 异常类名(参数);
例如
throw new NullPointerException("要访问的arr数组不存在");
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");
注意:运行时期异常java虚拟机会帮我们处理
案例
public class test03 {
public static void main(String[] args) {
int [] a= {1,2,3};
int index=4;
getArr(a,index);
}
public static void getArr(int[] a,int index) {
if (index>=0 && index <= a.length -1) {
System.out.println(a[index]);
}else {
/*
* 没有加throw的时候是 ArrayIndexOutOfBoundsException()(下表索引越界异常)
* 加throw后 被我设置成了控制针异常
*/
throw new NullPointerException("需要访问的数组不存在");
}
}
}
运行结果
重要如果产生了问题,我们就会throw将问题描述类即异常进行抛出,也就是将问题返回给该方法的调用者。那么对于调用者来说,该怎么处理呢?一种是进行捕获处理,另一种就是声明出去,使用throws声明处理。
2.throws 声明异常
声明异常格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
代码展示
没抛之前
抛出后
3.try/catch
捕获异常 Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
格式
try{
捕获信息(可能会出现错误代码)
}catch(异常信息){
处理方式
}finally{
不管程序怎样,这里都将会被执行
}
try: 放可能出现异常的代码。
catch: 用来对某些异常进行捕获,对捕获的异常进行处理。
注意 try和catch都不能单独使用,必须连用。finally不能单独使用。
public class test8 {
public static void main(String[] args) {
//try捕获
//捕获的FileNotFoundException异常
try {
//可能出现异常的代码,没有异常则不执行catch模块,但finally无论怎么都会执行
read("a.txt");
//try捕获什么异常,里面就放什么异常也可以放比他大的如(Exception)
} catch (FileNotFoundException e) {
System.out.println(e);
}finally {
System.out.println("aaasaa");
}
} //2.抛给调用者
public static void read(String path) throws FileNotFoundException {
//如果不是这个a.txt文件
if (!path.equals("a.txt")){
//如果不是这个a.txt,则该文件不存在,是个异常 throw手动抛出一个异常
//1.这个a.txt文件不存在抛出个异常
throw new FileNotFoundException("文件找不到");
}
}
}
当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行。
try {
read("a.txt");
return;//直接返回,finally里就不会执行
} catch (FileNotFoundException e) {
System.out.println(e);
}finally {
System.out.println("aaasaa");
}
多个异常使用捕获又该如何处理呢?
1.多个异常一次捕获,多次处理。(推荐)
try{
}catch(异常类型 A){
}catch(异常类型 B){
}
注意: 这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。