概述
程序的执行跟我们预期的不一样,需要对这种意外进行捕获。用到的关键字有try,catch,finally
异常分类
Error:不可修复的大问题。它是所有的错误类的父类。它是Throwable的子类。
Exception:可以捕获和处理,改变流程。但是不要为了专门改变流程而使用它。它是所有异常类的父类。它是Throwable的子类。有编译异常和运行时异常两种。
- 运行时异常:代码在运行期间出现的异常。
- 编译异常:编译期间就强制进行异常的捕获和处理。
语法
语法:try{
需要监控代码;
}catch(Exception e){
处理代码;
}
try{
// 对次段代码进行监控
System.out.println("吃饭");
System.out.println("睡觉");
System.out.println("开车");
System.out.println(5/0); // 发生了异常信息,跳转到异常处理流程,下面的代码不执行。
System.out.println("回家过年");
System.out.println("吃饭");
System.out.println("睡觉");
}catch(Exception e){
e.printStackTrace();// 打印此异常信息
System.out.println("出现了疫情,封城。");
}
运行时异常
RuntimeException:所有运行时异常都需要继承此类,没有继承此类的是编译异常。
我们可以通过多个catch块来进行多种异常处理,多种异常处理需要按照一定的顺序,父类在最后,子类在前面,可以有多个子类。
针对不同的异常有不同的处理方式:
}catch(ArithmeticException e){// 捕获异常
e.printStackTrace();// 打印此异常信息
System.out.println("出现了疫情,封城。");
}catch (NullPointerException e) {
e.printStackTrace();// 打印此异常信息
System.out.println("出现了恐怖分子,突突他。");
}catch(Exception e){//- 越父类越后面,越之类越前面。
e.printStackTrace();// 打印此异常信息
System.out.println("出现了其它异常情况,请小心。");
finally
- 写在catch块的后面,写在最后,只能有一个。
- 一般回收资源的代码写在里面。
- 即使try块中直接return,break,finally块里面的代码也会执行。可以使用
System.exit(1)
强制关闭虚拟机,则会跳出。
}finally{
// 无论什么情况都必须执行的代码逻辑。
System.out.println("无论是否异常我们也要吃饭。");
System.out.println("无论是否异常我们也要学习。");
// return 2 ;// 当try跟finally都有返回值的时候用的finally
}
return 2; // 出现异常返回2,不出异常返回上面的1
什么时候进行异常处理
- 有发生异常也必须处理的请求,比如释放资源,跟IO相关。
- 编译异常必须处理。
- 当如果出现异常的时候需要进行特殊处理,比如记录日志。
throws
- throws写在方法后面,表示这个方法可能出现的异常都抛给调用者处理,谁调用谁处理。
- throws是可以抛出多个异常,没有先后顺序。
// throws 写在方法后面,表示这个方法的异常都抛给调用者处理,谁调用谁处理。
public static void method2() throws Exception {
System.out.println("method2");
// 这里出现了异常,我们可以直接捕获处理。也可以不处理,让调用者来处理。
System.out.println(5/0);
}
// throws 是可以抛出多个异常的,没有顺序
public static void method3() throws Exception,NullPointerException,ClassCastException {
System.out.println("method3");
}
public static void method4() throws ClassNotFoundException {
System.out.println("method4");
Class.forName("");
}
throw
写在方法里面的,用来主动造一个异常。
创建一个异常类,在测试类中抛出。
public static void main(String[] args) {
setAge(18);
setAge(-18);
}
public static void setAge(int age) throws AgeOutOfBoundException{
if(age>0){
System.out.println("年龄为"+age);
}else{
throw new AgeOutOfBoundException("年龄不能为负数。");
}
}
自定义运行时异常
继承RuntimeException 类:
//自定义运行时异常
public class AgeOutOfBoundException extends RuntimeException {
public AgeOutOfBoundException(){
}
public AgeOutOfBoundException(String s){
super(s);
}
}
自定义编译异常
继承Exception类:
//自定义编译异常
public class AgeOutOfBoundException extends Exception {
public AgeOutOfBoundException(){
}
public AgeOutOfBoundException(String s){
super(s);
}
}