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