异常处理
异常的产生
在Java程序中,某行代码一旦出现异常且没有正确的处理,则程序就此中断,发生异常的代码以及之后的代码将不会执行
例子:不会产生异常的代码
System.out.println("1.除法计算开始"); System.out.println("2.除法计算:"+(10/2)); System.out.println("3.除法计算结束");
1.除法计算开始 2.除法计算:5 3.除法计算结束
例子:出现异常
System.out.println("1.除法计算开始"); System.out.println("2.除法计算:" + (10 / 0)); System.out.println("3.除法计算结束");
1.除法计算开始 Exception in thread "main" java.lang.ArithmeticException: / by zero at com.oracleoaec.test.Test.main(Test.java:7)
异常的分类
- checkedException(受查异常):
- Exception及其子类(不包括RuntimeException及其子类)
- 必须要处理,否则通不过编译
- 比如:
java.text.ParseException
- uncheckedException(非受查异常)
- RuntimeException及其子类
- 可以不用处理
- 比如:
java.lang.NullPointerException
异常的处理流程
Java程序中,如果合理的对异常进行处理,可以使程序更加的健壮
语法
try{
//可能出现异常的代码
}[catch(异常类型1 异常类对象){
//处理异常
}catch(异常类型2 异常类对象){
//处理异常
}]|[finally{
//无论是否出现异常都会执行的代码
}]
一般的组合:try-catch
、try-finally
、try-catch-finally
- 最常用:
try-catch
- 最不常用:
try-finally
,因为无法知道出现的异常类型以及出现异常的代码 - finally:一般用来释放资源
捕获一种异常
System.out.println("1.除法计算开始");
try {
//可能出现异常的代码
System.out.println("2.除法计算:" + (10 / 0));
}catch(ArithmeticException e) {
//处理异常
System.out.println("出现了异常");
}
System.out.println("3.除法计算结束");
1.除法计算开始
出现了异常
3.除法计算结束
根据执行结果可以看出,由于我们成功的捕获了异常,所以程序没有中断执行。对应异常来说,一旦发生异常就应用解决异常,也就是需要知道是那种异常,还要知道在哪一行代码发生的
一般在catch块会调用异常对象的printStackTrace()
输出异常的完整信息。
e.printStackTrace();
捕获多种异常
System.out.println("程序开始");
try {
int a = 10 / 2;
Integer.parseInt("123");
int [] nums = new int[3];
nums[3] = 10;
} catch (ArithmeticException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
System.out.println("程序结束");
可以在程序中追加多个catch块用来捕获多种异常
System.out.println("程序开始");
try {
int a = 10 / 2;
Integer.parseInt("123");
int[] nums = new int[3];
nums[3] = 10;
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("程序结束");
可以在程序中直接捕获异常类的父类Exception
注意:
- 不能重复捕获
- 当catch中有Exception异常需要捕获,则应该放到最后进行捕获
throw和throws关键字
- throw:在方法中可以在任意位置手动抛出异常,Java中已经定义好了很多异常类供我们使用
- throws:在方法声明时,告诉调用者此方法可能会抛出的异常
class NetBar {
public void enter(int age) throws IllegalArgumentException {
if (age < 18) {
// 抛出异常-参数不合法异常
throw new IllegalArgumentException("未成年人不准入内");
} else {
System.out.println("欢迎光临");
}
}
}
System.out.println("程序开始");
NetBar netBar = new NetBar();
try {
netBar.enter(17);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
System.out.println("程序结束");
自定义异常
Java中已经提供了很多异常类供我们使用,但是不可能预见所有的异常,有时需要自定义异常类一应对特殊的需求
示例
- 定义一个类继承自现有的异常类
class AgeLessThanEighteenException extends RuntimeException{
public AgeLessThanEighteenException(String msg) {
super(msg);
}
}