自定义异常
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内去匹配并执行相应的的语句 |
表示异常可能会出现,但是不一定会出现 | 一旦执行,一定出现异常 |