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");
}
/*
outputs:
进入try
进入catch
进入finally
java.lang.ArrayIndexOutOfBoundsException: 6
at Main.main(Main.java:15)
*/
主动抛出异常
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");
}
/*
outputs:
进入try
进入catch
进入finally
java.lang.Exception: 主动抛出异常
at Main.main(Main.java:14)
*/
}
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();
}
/*
outputs:
接收到fun抛出的异常
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at Main.fun(Main.java:30)
at Main.main(Main.java:15)
*/
}
static void fun() throws InterruptedException{
Thread.sleep(1000);
}