java异常处理

异常处理

异常的产生

在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-catchtry-finallytry-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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值