自定义异常
估计他们上完课就再也不玩了,自己那段时间上完课。也就基本上很少来了,主要是 没有什么记录的习惯,奇怪的是,每每到了心情不好的时候,总会想要写点什么。
不管怎么样还是出去花钱学习了一下,这段经历。嗯,很难评价,事实上如果不留下一笔,那么的确没有什么学习的意义。
所以,李飞要一点儿一点儿扳过来。
出去学习以后发现一个事儿,那就是我真的没有很聪明,接受知识,可能也没我自诩的那么快,记忆力也没那么好。所以要想成长,我真的要做的就是,勤奋,更加勤奋才行。
这天是袁海鹏老师授课。印象中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。
6、自定义异常步骤:
(1)创建异常类,继承Exception 或者 RuntimeException
(2)在异常类中定义构造方法,实现方法体
示例:public class AgeException()extends Exception{}
Public AgeException(String message){
Super(message);
}
(3) 抛出异常时,创建一个 异常类对象
示例:throw new AgeException(“年龄异常”);
练习:使用自定义异常实现对男女性别的验证。
接口优化:
方式:(1)先定义接口,然后让类直接实现
(2)先定义接口,然后定义实现类,如果哪个类需要对应的方法,则创建对应的实现类对象(使用接口实现多态)
选择依据:(1)如果实现的方法不是所有子类都拥有
(2)
补充:instanceof关键字:
语法:对象名 instanceof 类名/接口名
注:如果对象名和接口有关系,即该对象所属类实现了该接口,表示两者有关系。如果存在关系,则该对象可以强转成对应接口
示例:Animal cat= new Cat();//cat类和LegDao有关系
LegDao dao = (LegDao)cat;//对象可以转换成LegDao