异常分两种,检查异常和非检查异常,检查是由编译器检查,检查的是当你抛出异常之后,你是否做了异常处理,处理手段只有两种: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:数字格式化异常,当试图将字符串转成某种类型,但不能正常转换时,抛出该异常