• 欢迎光临~

Day28:自定义异常详解

开发技术 开发技术 2022-11-30 次浏览

自定义异常

Java中有很多异常类,但有时候我们会用到一些Java中没有提供的异常,需要我们自己去定义异常。

只要我们的类继承Exception或者RuntimeException,该类会变成异常体系的一员。

格式:

public class 类名 extends Exception/RuntimeException{//Exception为编译时异常;RuntimeException运行时异常
    无参构造;
    有参构造
}

范例:

public class ScoreException extends Exception{
    public ScoreException(){}
    public ScoreException(String message){
       super(message);
        //这里为什么要调用父类的有参构造器
        //当父类异常对象的有参构造器调用时,会把所带参数信息赋值给detaliMessage;最后会成为异常原因在调用打印信息时体现出来
    }
}

接下来我们来做一个自定义异常的范例:

检测输入的分数,要求0-100的分数为成绩合格,若用户输入区间外的分数则报出详细的异常分析

//定义一个异常类
public class ScoreException extends Exception{
    public ScoreException{}
    public ScoreException(String message){
        detailMessage=message;
    }
}
//创建一个含有检测方法的分数检查类
public class ScoreCheck{
    public void check(int a) throws ScorekException{//ScorekException属于编译时异常,若方法中没有处理则需要抛出去给调用者来处理异常
        if(a<0||a>100){
            throw new ScoreException();//出现异常则抛出一个异常对象,即实例异常对象
        }else{
            System.out.println("成绩合格")
        }
    }
}
public class Test{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);//创建扫描器接受用户输入
        System.out.println("请输入分数");//提示语
        int b=sc.nextInt();//将用户输入的符合我们需要的类型数据作为变量
        ScoreCheck s=new ScoreCheck();//分数检查类实例化
        try{
            s.check(b);
            //check方法抛出了异常,该异常为编译时异常,所以我们需要通过try——catch 来处理异常
            //check方法抛出的异常会去匹配下面catch的异常类型
        }catch(ScoreException e){//匹配成功,执行语句
            e.printStackTrace();//打印异常的所有分析
        }
        sc.close();//记得关闭扫描器,节约资源
    }
}
//输出结果
请输入分数
98
成绩合格

请输入分数
120
com.liuwei.oop.exception02.ScoreException
	at com.liuwei.oop.exception02.ScoreCheck.check(ScoreCheck.java:6)
	at com.liuwei.oop.exception02.Test.main(Test.java:12)
//这里我们发现我们输入120时,异常信息中并没有将异常原因分析出来,只是将异常类型、位置分析出来了
    //原因是我们在抛出异常对象时采用的是无参构造
    //我们应该抛出有参构造,将我们想要得到提示信息作为参数传递给Exception的原因分析,这样我们在调用Exception的printStackTrace时会打印原因分析
//修改抛出异常对象的参数
public class ScoreCheck{
    public void check(int a) throws ScorekException{
        if(a<0||a>100){
            throw new ScoreException("请保证输入的分数在0-100以内");
            //将我们想要的异常提示信息作为参数传递给有参构造,最后赋值给Exception的detailMessage
        }else{
            System.out.println("成绩合格")
        }
    }
}
//输出信息
120
com.liuwei.oop.exception02.ScoreException: 请保证输入的分数在0-100以内//此处则打印出了我们想要的异常原因分析提示语
	at com.liuwei.oop.exception02.ScoreCheck.check(ScoreCheck.java:6)
	at com.liuwei.oop.exception02.Test.main(Test.java:12)

1.1 throws和throw的区别

throws throw
用于方法声明的括号后,跟的是异常类型名 用于方法体中,跟的是异常对象名
表示抛出异常,谁调用方法谁处理异常 表示抛出异常,交给try—catch内去匹配并执行相应的的语句
表示异常可能会出现,但是不一定会出现 一旦执行,一定出现异常
程序员灯塔
转载请注明原文链接:Day28:自定义异常详解
喜欢 (0)
违法和不良信息举报电话:022-22558618 举报邮箱:dljd@tidljd.com