自定义异常class
自定义异常通常要配合 override “toString”命令,其实质是一个会报错的method,像一个交通违章通报LED,但何时被触发,如何算是违反交通,并不会在此class定义。
- 自定义异常class的步骤:
- 自建个异常类,继承自Exception总父类
- 类里面处理一些你觉得可能会出现异常的问题
- 最后把这个消息打印出来(toString)
注意这里的toString是继承自总类Object class下面的toString method,由用户在本级完成override,一般构建自定义异常在这一步都会用到toString method来帮忙输出提示个性化的信息。
比如新建一个叫做report_age_error的用户自定义exception,如果用户输入了0-130以外的年龄,那么我们就触发这个自定义exception class。
注意自定义exception仅仅是定义“通告批评”的内容,而不是在定义何人何时何地为什么会被“通告批评”。
package exception.demo02;public class report_age_error extends Exception{private int p_age;public report_age_error(int age) {this.p_age=age;}@Overridepublic String toString() {return "输入值为:"+p_age+",输入不合法.";}}
常用的IDEA快捷键:
- Alt+Insert打开构造器constructor
- 遇见红色波浪线,按住alt+enter,看报错提示。
使用自建的自定义异常class
刚刚建立好了自定义异常class,现在来构建判断异常被激活的method。
上一步建立了“通告批评公示内容”,现在来建立一个”通告批评被触发“的规则(这一步一般会出现 if XXX语句)。
比如定义了一个叫做checkage的method,位于valid_age_detect class文件之内,checkage method的功能是当age超过130或者小于0时,触发刚才建立的report_age_error class,或者age为正常范围时,就打印输出“正常”。
package exception.demo02;public class valid_age_detect{//定义一个“checkage” method,用来检查输入的年龄是否合法public static void checkage(int age) throws report_age_error {if (age > 130 || age <= 0) {throw new report_age_error(age);} else {System.out.println("输入的年龄:" + age + "已录入。");}}
}
Tips: 如果碰到了“Unhandled exception”错误
如果在main方法中捕获了一个异常并且直接再次抛出它,main方法本身就需要声明抛出这个异常。main方法是程序的入口点,所以如果没有其他代码来调用main方法并处理这个异常,那么当main方法抛出异常时,Java运行时环境就会认为这是一个未处理的异常,并报告错误。
要解决这个问题,你有几个选择:
- 在main方法上声明抛出异常(使用throws关键字)
- 在catch块中处理异常:你可以在catch块中记录错误信息、打印错误消息给用户、或者采取其他恢复措施。而不是直接抛出它。
类似这样
try { // ...
} catch (MyErr e) { System.err.println("发生错误: " + e.getMessage()); // 其他处理逻辑
}
下面用main模块来使用上面自建的checkage method和report_age_error class。
package exception.demo02;public class Test
{public static void main(String[] args) throws report_age_error{try {valid_age_detect.checkage(50);} catch (report_age_error e) {throw e;}try {valid_age_detect.checkage(150);} catch (report_age_error e) {//e.printStackTrace();可以用这一行直接打印错误提示信息throw e;//如果在这里想要用throw e 自定义的exception_object,必须要main程序在标题throws声明 自定义的report_age_error class文件://类似这样 main(String[] args) throws report_age_error{...}//否则编译通过不了}}}
输入的年龄:50已录入。
Exception in thread "main" 输入值为:150,输入不合法.at exception.demo02.valid_age_detect.checkage(valid_age_detect.java:7)at exception.demo02.Test.main(Test.java:39)Process finished with exit code 1
程序中使用user_exception class的步骤:
- 创建自定义user_exception class(一定要继承系统自带的exception class!!!)
- 在method内部写throw关键字抛出exception object
- 如果在当前抛出exception的method里处理exception,可以使用try catch捕获并处理。否则就在method的声明处(method 名字旁边)通过throws关键字,并且写上要抛出给method调用方的exception,继续进行下一步操作
- main方法为一般为最高阶,如果已经自定义了异常类,在main里想throw这个自定义异常,需要在main方法签名处利用throws声明这个异常类。
- main主程序通过调用method捕获并处理异常