一、异常是什么
程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
注意:异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.
二、异常体系
三、异常的分类
(一)、编译时异常(受检查异常)
checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
(二)、运行时异常
runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如:ArrayIndexOutOfBoundsException)
四、异常的作用
- 用来查询bug的关键参考信息
- 作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
五、捕获异常try…catch
1、格式
try{// 可能出现异常的代码;
}catch(Exception e){// 异常的处理代码;
}注意:try和catch都不能单独使用,必须连用。
2、目的
当代码出现异常时,可以让程序继续往下执行。
3、获取异常信息:
Throwable类中定义了一些查看方法:
public String getMessage()
:获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
public String toString()
:获取异常的类型和异常描述信息(不用)。public void printStackTrace()
:打印异常的跟踪栈信息并输出到控制台。
4、多个异常的捕获
- 多个异常分别处理。
- 多个异常一次捕获,多次处理。
- 多个异常一次捕获一次处理。
try{ 编写可能会出现异常的代码
}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获. 处理异常的代码 //记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获. 处理异常的代码 //记录日志/打印异常信息/继续抛出异常
}注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间
有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
六、声明异常throws
1、声明异常:
将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。
2、格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
public class ThrowsDemo { public static void main(String[] args) throws FileNotFoundException { InputStream is = new FileInputStream("a.txt");}
}
七、抛出异常throw
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
格式:
throw new 异常类名(参数);
例:
public static int getElement(int[] arr,int index){ //判断 索引是否越界if(index<0 || index>arr.length-1){/*判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。 */throw new ArrayIndexOutOfBoundsException("下标越界。。。");}int element = arr[index];return element;
}
八、 finally 代码块
有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
格式:
try{// 可能出现异常的代码;
}catch(Exception e){// 异常的处理代码;
}finally{// 必须执行的代码
}
注:当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行。
九、异常注意事项
- 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
- 如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
- 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
- 当多异常处理时,捕获处理,前边的类不能是后边类的父类
- 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
十、自定义异常
1、什么是自定义异常类:
在开发中根据自己业务的异常情况来定义异常类.
2、为什么需要自定义异常类:
我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是SUN没有定义好的,此时我们根据自己业务的异常情况来定义异常类。,例如年龄负数问题,考试成绩负数问题。
3、异常类如何定义:
- 自定义一个编译期异常: 自定义类 并继承于
java.lang.Exception
。 - 自定义一个运行时期的异常类:自定义类 并继承于
java.lang.RuntimeException
。
例:
public class MyException extends RuntimeException{public MyException(){}public MyException(String message){super(message);}}