目录
什么是异常?
异常是指在程序执行的过程中,出现了非正常的情况,最终会导致JVM非正常停止;
java是如何处理异常的?
如果程序在运行过程中出现了异常,那么会产生一个异常对象,程序会把这个异常对象交给JVM处理,JVM就会中断程序,并在控制台打印出这个异常的信息;
异常的体系结构:
最顶层的父类:'java.lang.Throwable',其下有两个子类:'java.lang.Error'和'java.lang.Exception';
Error : 严重的错误,无法处理的错误,只能事先避免;
Exception : 编译期异常(进行编译程序时出现的问题),异常产生后可以通过修改代码纠正,使程序继续运行;
它有一个特殊的子类:RuntimeException(运行期异常),程序在运行过程中出现的问题;
异常的产生和处理:
异常的处理:
throw
可以在指定方法中抛出指定的异常;
使用格式: throw new xxxException("异常产生的原因")
注意事项:
- 必须写在方法的内部;
- new的对象必须是Exception或者是其子类;
- throw关键词抛出指定的异常对象,我们就必须处理这个异常对象;如果是RunTimeException或其子类,可以不处理,默认交给JVM处理(打印异常对象,中断程序);
public static int getElement(int[] arr ,int index){
if (arr == null){
throw new NullPointerException("传递的数组为空");
}else if (index < 0 || index > arr.length-1){
throw new ArrayIndexOutOfBoundsException("传递的索引超过了数组的范围");
}
return arr[index];
}
方式一 : throws
当方法内部抛出异常对象的时候,我们就必须处理这个异常对象;
可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(谁调用,谁处理);
使用格式: 在方法声明时使用
修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException{
throw new AAAException("产生原因");
throw new BBBException("产生原因");
}
注意事项 :
- 必须写在方法声明处;
- 声明的对象必须是Exception或其子类;
- 如果抛出多个异常对象,throws必须也声明多个异常,如果有子父类关系,那么直接声明父类异常即可;
- 调用一个声明抛出异常的方法,就必须处理声明的异常,要么继续使用throws声明抛出,交个方法的调用者处理,要么try...catch自己处理异常;
public static void urlPath(String url) throws FileNotFoundException {
if (!url.equals("C:\\a.txt")){
throw new FileNotFoundException("文件路径不对");
}
}
方式二 : try catch
java中对有可能会造成异常的语句进行捕获,对捕获的异常进行指定方式处理;
使用格式:
try{
编写可能会出现异常的代码;
}catch(异常类型 e){
处理异常的代码;
}
注意事项:
- try中可能抛出多个异常对象,可以使用多个catch来处理这些异常;
- 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完catch后,继续执行后续代码;
- 如果没有产生异常,就不会执行catch中异常的处理逻辑;
public static void main(String[] args) {
try {
urlPath("D:\\a.txt");
} catch (FileNotFoundException e) {
// e.printStackTrace();
System.out.println("文件路径不对");
}
System.out.println("后续代码");
}
public static void urlPath(String url) throws FileNotFoundException {
if (!url.equals("C:\\a.txt")){
throw new FileNotFoundException("文件路径不对");
}
}
}
throwable类中定义了三个查看异常的方法:
- String getMessage() 返回 throwable的简短描述;
- String toString() 返回throwable的详细信息字符串;
- void printStackTrace() JVM打印的异常对象,最全面的异常信息;
try {
urlPath("D:\\a.txt");
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
finally代码块:
使用格式:
try{
编写可能会出现异常的代码;
}catch(异常类型 e){
处理异常的代码;
}finally{
无论是否出现异常都会执行;
}
注意事项:
- 必须跟try catch一起使用;
- 一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO流知识);
- 避免在finally写return;