一、异常
概述: 异常指的是不正常,指的是程序中出现了某种问题
java中,所有问题都可以使用一个类来表示,这个类叫做Throwable
Throwable:
Throwawble是java中所有异常和错误的父类
Error: 表示错误,指的是不可挽回的严重问题
Exception: 表示异常,指的是可以挽回的轻微问题,
处理异常两种方式:
1、往外抛(甩锅):throw throws
2、解决问题: try...catch
二、Throw关键字
如果想要手动创建异常,并手动抛出,我们需要throw关键字
格式: throw new 异常类名();
注意: 如果方法内抛出异常,那么这个方法剩下的代码不会执行,程序直接回到调用者
if(index < 0 || index > arr.length - 1) {
String msg = "索引的取值范围必须是0到" + (arr.length - 1) + ", 您给的索引为:" + index;
throw new ArrayIndexOutOfBoundsException(msg);
}
System.out.println("你好");
return arr[index];
//控制台中打印异常结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 索引的取值范围必须是0到1, 您给的索引为:10
上面代码在控制台中打印异常结果,并没有执行输出语句。
三、throws关键字
throws: 进行异常声明,表示方法内部可能会抛出异常
格式: 修饰符 返回值类型 方法名(参数列表) throws 异常类名{
}
注意: 1、如果在一个方法内抛出了编译时异常,那么一定要进行异常的声明
2、如果调用使用了throws声明异常的方法,那么作为调用者要么处理,要么抛出
3、当一个方法内抛出了运行时异常,可以使用throws进行异常声明,也可以不做声明
4、在一个方法内如果可能抛出多个异常,那么可以使用throws声明这些异常,也可以直接声明这些异常的父类
public static void method3() throws Exception{ //方法内抛出了两个异常,可以用Exception声明
int i = 0;
if(i % 2 == 0) {
throw new IOException(); //IO异常
} else {
throw new ClassNotFoundException(); //classNotFound异常
}
}
四、try...catch
如果代码出现异常之后,不希望把这个异常往外抛,可以使用try...catch解决这个问题
格式:
try{
可能会出现异常的代码
}catch(要捕获的异常类名 变量名){
出现异常后执行的代码
}
执行流程:
如果try中代码没有问题,那么执行完try之后,会跳过catch继续往下执行
如果try中的代码有问题,并且catch捕获到了这个异常,那么就会直接进入到catch中执行
如果try中的代码有问题,但是catch没有捕获到这个异常,那么这个异常会依旧往外抛
总结:如果catch到了就进入catch内部解决,如果没有catch到就仍然甩锅
try {
Object obj = null;
obj.toString();
System.out.println("1. try...end");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("2. catch代码...");
}
System.out.println("3. main...end"); //控制台中打印 Exception in thread "main" java.lang.NullPointerException
上方代码try中异常是:NullPointerException的异常
catch中是: ArrayIndexOutOfBoundsException,并没有捕捉到try中异常
所以 : 仍然将NullPointerException抛给JVM在控制台打印