异常机制&自定义异常

自定义异常:

在程序中,可能会遇到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语句都会执行

  1. 即使try和catch中存在return语句,finally语句也会执行,只是在执行完finally语句后再通过return退出
  2. finally语句块只有一种情况是不会执行的,即执行finally之前遇到了System.exit(0)结束程序的执行

相关文章: