文章目录
1. 基本信息
- 异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常执行。异常指的并不是语法错误
- 异常的根类是:
java.lang.Throwable
,其中有两个子类:java.lang.Error(不能处理,只能尽量避免)和java.lang.Exception(由于使用不当,可以避免)
2. Throwable 体系
2.1 Exception
- 异常就相当于程序得了一个小毛病,把异常处理掉,程序可以继续运行。
- 编译时期异常:也被称之为可检查异常,在编译过程中,就会检查,如果说有处理异常,就会编译失败
- 运行时期异常:也被称之为不检查异常,在运行过程中,检查异常,在编译过程中并不会强制要求
2.2 Error
- Error 是指在正常情况之下,不大可能出现的情况,绝大部分的Error 都会导致程序处于非正常,不可恢复的状态。不便于也不需要进行捕获
- 错误相当于程序出现了一个无法自行解决的问题,必须修改源代码,程序才能够继续执行
2.3 常见的 Exception 和 Error
- 两者都是集成了Throwable类,在Java中, 只有Throwable类型的实例才可以被抛出或者是捕获,他是异常处理机制的基本组成类型。
ClassNotFoundException
:当应用程序试图使用以下方法通过字符串名加载类时,但是没有找到指定名称的类的定义,抛出该异常:
- Class 类中的 forName 方法。
- ClassLoader 类中的 findSystemClass 方法。
- ClassLoader 类中的 loadClass 方法。
NoClassDefFoundError
:运行时JVM加载不到类或者是找不到类
3. 异常的处理
3.1 抛出异常throw
抛出异常是如何进行操作的
-
创建一个异常对象,封装一些提示信息(信息是可以由自己进行编写的)
-
需要将这个异常告知调用者,怎么告知,怎样将这个异常对象传递到调用者处,--------通过关键字throws是可以进行操作的,throw处异常对象
作用
可以使用throw 关键字在指定的方法中抛出指定的异常
使用格式
throw new XXXXXException ("异常产生的原因")
注意事项
必须写在方法的内部,后面所new的对象必须是Exception或这是Exception的子类对象
案例
public class demo {
public static int getIndex(int []arr ,int index){
int num = arr.length -1;
if( index > num || index<0){
throw new ArrayIndexOutOfBoundsException("数组下标异常");
}
return arr[index];
}
public static void main(String[] args) {
int arr[]= {34,54,56};
System.out.println(getIndex(arr,1));
System.out.println(getIndex(arr,5));
System.out.println(getIndex(arr,2));
}
}
3.2 捕获异常try catch finally
try{
//可能出现异常的部位
}catch(异常类型 e){
//处理异常代码,用于进行某种异常的捕获,可以对出现的异常进行处理
}
-
捕获异常:可以对出现的异常进行指定的处理
-
try- catch
必须是连用的,不能单独出现 -
finally
中无论异常是否会出现,都需要执行。由于异常会引起程序跳转,导致有些语句是不会执行到的,所以说finally
就是用来解决这种问题的,因为finally
中的代码块是必须要执行 -
finally
不可以单独使用
4. 注意事项
- 如果有多个异常要处理,一般是先处理小异常,再依次处理较大的异常。
- 尽量不要去捕获类似 Exception这样的通用异常,而是应该捕获特定的异常,方便最终的错误定位
- try -cache 代码块会产生额外的性能开销,会影响JVM对代码进行优化,所以,仅仅建议捕获有必要的代码,尽量不要一个大的try包住整段的代码