[API]检查与非检查异常&异常处理的机制&常见的RuntimeException(九)

异常分两种,检查异常和非检查异常,检查是由编译器检查,检查的是当你抛出异常之后,你是否做了异常处理,处理手段只有两种:try...catch和throws。

  • 检查异常:当抛出检查异常时,编译器检查你是否做了异常处理,若没有做异常处理则编译错误

  • 非检查异常:当抛出非检查异常时,不管你做没做异常处理,都不会报错,只有RuntimeException才是非检查异常,当然它的子类也都是非检查异常。

异常处理机制:

  • throw:用于对外主动抛出一个异常,通常有两种情况需要主动抛出

    • 程序执行遇到一个异常,但是该异常不应当在当前代码片段中被解决时可以抛出给调用者

    • 当程序遇到一个满足语法,但不满足业务要求时,可以抛出一个异常告知调用者

  • throws:当一个方法中使用throw抛出一个检查异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译错误。

注意:当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。 处理手段有两种:

  • 使用try-catch捕获并处理这个异常

  • 在当前方法上继续使用throws声明该异常的抛出给调用者解决。 具体选取那种取决于异常处理的责任问题。

  • 不要在main()方法上throws。

 

自定义异常:通常用于定义业务逻辑上的异常,一般要符合如下规则:

  • 类名要见名知意

  • 继承Exception(直接继承或间接继承)

  • 提供超类异常所提供的所有构造器

package exception;

/**
 * 自定义异常:通常用于定义那些不满足业务场景的异常
 * 自定义异常的几个要素:
 * 1.类名要见名知意
 * 2.继承自Exception(直接或间接继承都可以)
 * 3.提供所有类型的构造器
 */
public class IllegalAgeException extends Exception {
    public IllegalAgeException() {
        super();
    }

    public IllegalAgeException(String message) {
        super(message);
    }

    public IllegalAgeException(String message, Throwable cause) {
        super(message, cause);
    }

    public IllegalAgeException(Throwable cause) {
        super(cause);
    }

    protected IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

package exception;

/**
 * 测试异常的抛出
 */
public class Student {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws IllegalAgeException {
        if(age<0 || age>100){
            /*
              当使用throw抛出一个非RuntimeException时,必须在当前方法上用throws声明该异常的抛出
             */
            throw new IllegalAgeException("年龄不合法");
        }
        this.age = age;
    }
}

package exception;

/**
 * throws的演示
 */
public class ThrowsDemo {
    public static void main(String[] args) {
        /*
          当调用一个含有throws声明异常抛出的方法时,编译器要求必须处理该异常,处理手段有两种:
          1. try...catch捕获并处理这个异常
          2. 在当前方法上(main)上继续使用throws声明该异常抛出给上层调用者
          3. 一般不在main方法中做throws抛出
         */
        Student zs = new Student();
        try {
            zs.setAge(250);
        } catch (IllegalAgeException e) {
            e.printStackTrace(); //打印错误堆栈信息
            //System.out.println(e.getMessage()); //获取错误信息并输出
        }
        System.out.println("此人年龄为"+zs.getAge()+"岁");
    }
}

常见的RuntimeException的子类:----运行时异常

  • NullPointerException:空指针异常,当程序通过引用去打点,但引用的值为null时,抛出该异常

  • ArrayIndexOutOfBoundsException:数组下标越界异常,当使用数组下标超出范围时,抛出该异常

  • StringIndexOutOfBoundsException:字符串下标越界异常,当使用字符串下标超出范围时,抛出该异常

  • ClassCastException:类型转换异常,当引用类型强转不符合强转条件时,抛出该异常

  • NumberFormatException:数字格式化异常,当试图将字符串转成某种类型,但不能正常转换时,抛出该异常

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值