异常处理
异常的分类
Throwable是所有异常类的父类派生了两大类Error与Exception
Error是用来描述java运行系统中的类部错误像内存溢出等
Exception类称为非致命性类,可通过捕捉处理程序使其继续执行
Exception又分为运行异常(RuntimeException和其下子类)和其他类属于编译时异常
JVM处理异常方式
Main方法收到问题后又两种处理方式
第一种程序种有捕捉处理程序去处理
第二种程序种没能处理,就会让JVM来处理(将异常名称,异常信息,异常出现的位置打印在控制台,同时停止运行)
处理异常方法
try...catch代码块
当try中代码出现异常时中断就会产生相对应的异常类对象传入catch中并开始执行catch中的代码
class test{
public static void main(String[] args) {
int[] arr = {1,2,3};
try {
System.out.println(arr[3]);
}catch (ArrayIndexOutOfBoundsException e) {// 接收来自try中异常产生的参数
System.out.println(e.getMessage());// 打印异常参数信息
System.out.println(e);// 异常名加异常信息
e.printStackTrace();// 异常名加异常信息加异常位置
}
}
}
结果:
3
java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.ArrayIndexOutOfBoundsException: 3
at first.a.test.main(test.java:13)
使用多个catch可以捕捉不同种类的异常,但一般用它们的父父类Exception就好了
try{
}catch(ArrayIndexOutOfBoundsException e){
}catch(ArithmeticException e){
}
完整的异常处理语句要加上finally无论有无异常都会执行,就算try代码块提前收到返回值即函数结束,它仍然会把finally执行之后再结束。除非在之前虚拟机被关闭System.exit()或者它本身有异常以及程序所在线程死亡,这些种情况下才不会被执行
抛出异常
throws通常被应用在声明方法时来指定抛出的异常
调用声明了异常的方法就会有编译异常
需要用捕捉语句对调用方法的语句进行处理
或者继续往上抛,即包含此语句的方法
class test{
static void ff(int a) throws Exception{
if(a==0){
throw new Exception("出错了");
}
}
public static void main (String[] args) throws Exception{
ff(0);// 会有异常,抛给main方法。也可以用捕捉语局处理
}
}
自定义异常类
继承Exception并构造方法传入参数信息
重写了构造器后就要自己把调用父类构造器添上
public class MyException extends Exception{
public MyException(String message){
super(message);
}
}
// 然后就可以使用此异常类,和上面使用一样