异常的继承层次
顶级类:Throwable
Exception类:是程序员能够写代码处理的异常根类分为两个类别:
免检异常:不是必须添加try catch finally的程序是能够编译和执行的,执行时触发了符合了的异常程序还是意外终止
必检异常:必须添加try catch finally,如果不添加则会有红波浪线提示,说明程序是不能编译和执行的
Error类:不是程序员能使用的,一般情况下是jvm使用的
如何判断异常是免检异常还是必检异常
如果程序员在写代码没有报错,但报红波浪线了,并提示"UnHandled
exception type XXXException" 这句话属于必检异常
必检异常必须添加try catch 否则红波浪线不会消失
throws
throws关键字放在方法声明的后边,可以写很多个异常类型,直接用逗号间隔表明此方法体可能会抛出的异常,这些异常不在当前的方法体中用try catch finally来处理谁调用此方法谁用try catch finally 来处理
注意:Exception类型必须放在所有异常类型的最后边
throws的应用场景,一般情况下,写类库的时候类库是提供给其他项目使用的,类中的方法如果有异常的,就适合用throws抛出,然后谁调用方法,谁就用try catch来处理
throw
在java中有一个Exception类,这个类有很多子类,每个子类都对应一种异常类型,这些异常类型都是java类库自带的异常类型,比如NullPointerException,类似于这些异常都是java定义完的规则,触犯规则就抛出异常,即,系统定义的规则,系统 检测到就由系统抛出
java不可能把所有的项目中遇到的异常都事先写好异常类,由程序员根据实际的业务来抛出异常
自定义异常
程序员自己创建的java类,但是必须继承自Exception及其子类中的任何类都可以,那么此类就是自定义异常类
自定义异常类就是作为本项目的异常类型补充
应用场景:java不可能把所有的项目中遇到的异常都事先写好异常类,由程序员根据实际的业务来自定义异常类,在自定义异常类中提供异常错误信息
示例代码
/**
*自定义异常类 AgeException
* @author PC
*
*/
public class AgeEcxeption extends Exception{
public AgeEcxeption(){
super("年龄不对1");
}
public AgeEcxeption(String message){
super(message);
}
@Override
public String getMessage() {
return "年龄不对";
}
}
//测试模块
private void setAge3(int age) throws AgeEcxeption{
if(age>=1 && age<=100){
this.age=age;
}else{
//建议抛免检异常
throw new AgeEcxeption("年龄不正确");
}
}
@Test
public void testMethod3(){
// setAge3(10000);
try {
setAge3(10000);
} catch (AgeEcxeption e) {
e.printStackTrace();
e.getMessage();
//System.out.println(e.getMessage());
}
}