java异常处理
异常的分类
Java标准库里通用的异常是以Throwable 为顶层父类,再派生出Error 类和Exception 类。如下
- Error:代表了JVM和系统的错误,不允许捕获
- Exception:这一类异常一般是在我们编辑的过程中产生的,是要处理或避免的
- Runtime_Exception:运行时异常,指Java程序在运行时产生的由解释器引发的各种异常,如数组越界,通常是逻辑错误。由于量非常多,为了节省系统开销,编译器不对这种异常进行检测,需要人为去避免。
- Checked_Exception:可检测异常(实际上没有这个类,只要不是运行时异常,就是可检测异常),指Java编译器可以利用分析方法或构造方法检测出的异常,通常是外部可能发生的错误,如
IOException 。这类异常必须处理,如不处理,会在编译时就报错。
一个好的程序应该且仅应该抛出或处理可检测异常,因为如果是Error,那么程序员通常没有办法,而运行时错误主要是逻辑错误,完全可以通过修改程序去避免,只有可检测异常是无法避免且必须处理的
常见的异常
-
Runtime_Exception
异常类 | 描述 |
---|
NullPointerException | 空指针引用异常 | ClassCastException | 类型强制转换异常 | IllegalArgumentException | 传递非法参数异常 | ArithmeticException | 算术运算异常 | ArrayStoreException | 向数组中存放与声明类型不兼容对象异常 | IndexOutOfBoundsException | 下标越界异常 | NegativeArraySizeException | 创建一个大小为负数的数组错误异常 | NumberFormatException | 数字格式异常 | SecurityException | 安全异常 | UnsupportedOperationException | 不支持的操作异常 |
-
Checked_Exception
异常类 | 描述 |
---|
Exception | 异常 | FileNotFoundException | 文件未找到异常 | IOException | 输入输出流异常 | SQLException | 数据库异常 | InterruptException | 中断异常 |
捕获异常
语法:
try{
}catch(异常类型1 异常的变量名1){
}catch(异常类型2 异常的变量名2){
}finally{
}
其中,try 是需要捕获异常的代码块,catch 是捕获对应异常后的处理代码块
finally 是无论有没有异常发生都会执行的代码块,即使执行了break ,continue ,return
例如
int[] a = new int[5];
try{
System.out.println("进入try");
a[6]++;
}catch (Exception e){
System.out.println("进入catch");
e.printStackTrace();
}finally {
System.out.println("进入finally");
}
主动抛出异常
throw
使用关键字throw 可以主动抛出一个异常对象
例如:
public static void main(String[] args) throws Exception {
try {
System.out.println("进入try");
throw new Exception("主动抛出异常");
} catch (Exception e) {
System.out.println("进入catch");
e.printStackTrace();
} finally {
System.out.println("进入finally");
}
}
throws
在定义方法的时候使用关键字throws 声明该方法可能抛出的异常,表示这个方法不处理这些异常,将这些异常交给调用该方法的代码处理。
注意:这里抛出的异常一定是可检测异常,运行时异常会自动向上抛出,直到遇到处理块或报错,不需要使用throws
注意:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常
语法:
void fun() throws Exception
例如:
public static void main(String[] args) {
try {
Thread.currentThread().interrupt();
fun();
}catch (Exception e){
System.out.println("接收到fun抛出的异常");
e.printStackTrace();
}
}
static void fun() throws InterruptedException{
Thread.sleep(1000);
}
参考网址
|