自定义异常:
在程序中,可能会遇到JDK提供的任何标准异常类都无法描述清楚用户性要表达的问题,这种情况下,可以创建自己的异常类,即自定义异常类
注意
- 自定义异常只需要从Exception类或者自己的子类派生一个子类即可
- 自定义异常类如果继承Exception类,则为受检查异常,必须进行处理,如果促性处理,可以让自定义异常类继承RuntimeException(运行时异常)类
- 通常自定义异常类应该包含两个构造器,一个是默认的构造器,另一个是带有详细信息的构造信息的构造器
第一步:自定义异常类
/*包名*/
package ex;
public class chushu extends Exception{
public chushu() {
super();
// TODO 自动生成的构造函数存根
}
public chushu(String message) {
super(message);
// TODO 自动生成的构造函数存根
}
}
自定义异常的使用:
package ex;
public class Dome3 {
public void devide(int a,int b) throws chushu{
if(b==0) {
/*1*/ //throw new chushu("除数不可以为零");
/*2*/ throw new chushu();
}
System.out.println("计算的结果为:"+a/b);
}
public static void main(String[] args) {
Dome3 jisuan = new Dome3();
try {
jisuan.devide(12, 2);
} catch (chushu e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
jisuan.devide(12, 0);
} catch (chushu e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
我标记的1,是调用带有详细信息的构造器,信息储存在message中。我标记的2,是调用默认的构造器
这是注释掉2的效果
计算的结果为:6
ex.chushu: 除数不可以为零
at ex.Dome3.devide(Dome3.java:6)
at ex.Dome3.main(Dome3.java:23)
这是注释掉1的效果
计算的结果为:6
ex.chushu
at ex.Dome3.devide(Dome3.java:7)
at ex.Dome3.main(Dome3.java:23)
以下内容与今天无关:
try-catch-finally处理过程:
程序首先执行可能发生的异常try语句块,如果try语句块没有发生异常,则执行完后跳至finally语句执行块,如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理,catch语句块可以有多个,分别捕获不同类型的异常,catch语句执行完后,程序会继续执行finally语句块,finally语句是可选的,如果有的话,不管是否发生异常,finally语句都会执行
- 即使try和catch中存在return语句,finally语句也会执行,只是在执行完finally语句后再通过return退出
- finally语句块只有一种情况是不会执行的,即执行finally之前遇到了System.exit(0)结束程序的执行