> 文章列表 > [API]检查与非检查异常异常处理的机制常见的RuntimeException(九)

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

[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:数字格式化异常,当试图将字符串转成某种类型,但不能正常转换时,抛出该异常