自定义异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义异常相关的知识,希望对你有一定的参考价值。

估计他们上完课就再也不玩了,自己那段时间上完课。也就基本上很少来了,主要是 没有什么记录的习惯,奇怪的是,每每到了心情不好的时候,总会想要写点什么。

 

不管怎么样还是出去花钱学习了一下,这段经历。嗯,很难评价,事实上如果不留下一笔,那么的确没有什么学习的意义。

 

所以,李飞要一点儿一点儿扳过来。

 

出去学习以后发现一个事儿,那就是我真的没有很聪明,接受知识,可能也没我自诩的那么快,记忆力也没那么好。所以要想成长,我真的要做的就是,勤奋,更加勤奋才行。

 

这天是袁海鹏老师授课。印象中10.13,因为是10.12走的。

 

今天讲授的是自定义异常。

 

自定义异常的步骤:

1、创建一个类。继承exception或者 runtimeException。

2、构造函数的书写。

3、非法状态下创建该类的对象。

示例1:

package ExceptionPart;

public class SelfDefinitionException extends Exception {
    
    public SelfDefinitionException(String message){
        super(message);
    }
    
    public static void main(String[] args) throws SelfDefinitionException{
        throw new SelfDefinitionException("lifei");
    }
    
}

 

 

运行结果:

Exception in thread "main" ExceptionPart.SelfDefinitionException: lifei
at ExceptionPart.SelfDefinitionException.main(SelfDefinitionException.java:10)

 

这样好像没什么意思。什么也有没有做一样,事实上,如果单独看这个东西,确实什么也不是。这样需要考虑自定义异常是用来干什么的?就是遇到了问题,然后掷出问题。避免一些不合法的状况发生。把一些在编译环境下允许的东西以异常的形式报告给开发人员,从而更好地解决当前问题。

比如,我们往数据库的年龄字段存储负数或值过大的数的时候,可能会在某一个未知的环节出错。如果我们在开始填入的时候就规定了这个数的值域的话,那么后期维护的成本就会很低。

所以合理的逻辑是,如果某个数值不合乎要求,那么就会出现异常。所以。我们不需要再主函数中直接报出异常。给一个条件。

if(年龄不合理){

  throw new AgeException("年龄不合理");

}

按照这个逻辑的话:

public class AgeException extends Exception {
  public AgeException(){
    super("年龄不合理异常");
  }
}

 

所以示例2:

package ExceptionPart;

//年龄异常处理类
public class AgeException extends Exception {
    //构造函数
    public AgeException(){
        //重写
        super("年龄不合理异常");
    }
}

 

package ExceptionPart;
public class AgeExceptionTest {    
    public static void main(String[] args) throws AgeException {
        //设置
        int age = -5;
        //检测
        if(age>150||age<0){
            throw new AgeException();
        }//【后来标记 ,第9行】
        //输出
        System.out.println("my age is "+age);
    }
}

运行结果:

Exception in thread "main" ExceptionPart.AgeException: 年龄不合理异常
at ExceptionPart.AgeExceptionTest.main(AgeExceptionTest.java:9)

 

练习:

创建一个关于性别的自定义异常类,男女是合法的。

package ExceptionPart;

public class GenderException extends Exception {
    
    public GenderException() {
        super("输入的性别不符合规范");
    }
    public GenderException(String message){
        super(message);
    }

}
package ExceptionPart;

public class GenderExceptionTest {
    public static void main(String[] args) throws GenderException {
        String gender = "s";
        if(!"男".equals(gender)&&!"女".equals(gender)){
            throw new GenderException("性别的输入不符合规范");
        }
        System.out.println("小明的性别是:"+gender);
    }
}

 

 

 

问题:

出了一个这样的问题:并不知道 怎么解决。

希望和小伙伴们一起探讨一下:

问题来源:期望写一个当前类的重载函数。然后根据年龄的数值来决定调用 使用哪一个语句进行输出。

但是出现了这样一个异常。

package ExceptionPart;

public class AgeException1 extends Exception{
    private final String NATIVETIPS = "当前年龄为负数";
    private final String BIGTIPS = "当前年龄过大";
    private static String result = "您的年龄不合法";
    public AgeException1(int age){
        
        if(age<0){
            result=NATIVETIPS;
        }
        else if(age>150){
            result = BIGTIPS;
        }
        System.out.println(age);
        System.out.println(result);
        super(result);//这里编译器 会报错
    }
    public AgeException1(){
        super(result);
    }
}

更改方式:

package ExceptionPart;

public class AgeException1 extends Exception{
    private final String NATIVETIPS = "当前年龄为负数";
    private final String BIGTIPS = "当前年龄过大";
    private static String result = "您的年龄不合法";
    public AgeException1(int age){
        super(result);//挪到这里就没有问题。
        if(age<0){
            result=NATIVETIPS;
        }
        else if(age>150){
            result = BIGTIPS;
        }
        System.out.println(age);
        System.out.println(result);
        //把刚刚那句话拿上去,就没有问题
    }
    public AgeException1(){
        super(result);
    }
}

然后报的编译错误是:

Constructor call must be the first statement in a constructor

猜想这句话应该翻译为:构造函数的调用必须在一个构造函数中优先(首先)声明。

当前类在创建的时候,优先调用父类的构造函数。所以不写的话,就算了,写就只能出现在第一行。然后优先调用。不写的话,就优先,并且默认调用。

 

 

如有问题欢迎探讨和斧正。BY Letben。

 

以上是关于自定义异常的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段——声明函数

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段8——声明函数