异常与断言

掌握分析与学习目的


1.掌握java异常机制的处理方法


2.了解断言的作用


一.概述


1.java的异常机制:一旦出现异常,可以由运行的方法或由虚拟机生成一个异常对象,包含异常事件的类型以及发生异常时程序的状态等信息。


2.java的类库中提供一个Throwable类,所有的异常对象都必须是它的实例或它子类的实例。Throwable类中的方法对抛出异常进行描述。


3.Error类包括动态连接失败,硬件设备等不可查的严重错误这类异常都有java语言来抛出和捕获。


4.编程者需要抛出和捕获的都是Exception这类异常。


二.异常处理类型:捕获异常和声明抛出异常。


1.捕获异常:要求在程序的方法中预先声明,在调用方法时用try{}actch(){}[finally{}]程序块捕获并处理。


2.声明抛出异常用throws子句声明并用throw语句抛出异常到调用方法中。


3.自定义异常:要求所定义的异常类必须是Exception的子类。


public class ThrowableException{
	public static void main(String[] args){
		try{
			throw new Throwable("My Exception");
		}catch(Throwable e){
			System.out.println("e.getMessage:"+e.getMessage);
			System.out.println("e.printStackTrace():");
			e.printStackTrace();
		}
	}
}

三.异常处理编程的提醒


1.finally语句:捕获异常的统一出口


2.异常处理的原则


(1)在捕获或声明异常时,应注意选择适当的异常类,选择适当的地方处理,是在方法内处理还是用throws子句传递给调用栈的上层。


(2)把异常处理的代码与正常的代码分开。


(3)利用finally语句作为异常处理的统一接口。


(4)能用简单测试不要用异常控制,对异常不要过分细化,也不要压制。


四.断言:对布尔表达式进行检查,一个正确的程序必须保证这个布尔表达式的值为true。若该值为false,说明程序已经处于不正确的状态,系统将给出警告或退出。


一般来说,断言用于保证程序最基本,关键的正确性。断言检查通常在开发和测试时开启。


1.语法:两种语法格式:


assert <boolean_expression>;


assert <expression1>:<expression2>


第二种格式的expression2可以是任何对象或原始类型(包括null),若表达式为false,就引发AssertionError。不要捕获该错误,否则程序会异常停止。


2.使用:一般用于检查一些关键的值,并且这些值对程序或者局部功能有很大的影响。并且这种错误不容易恢复。


(1)内在不变式:在确信某种情况总存在时编码,就可用内在不变式断言来保证假设的正确性。如:


if(x>0){
	//do something
}else{
	assert(x == 0);
	//do something 否则x为负
}

(2)控制流不变式


switch(x){
	case 1:
		//...;
		break;
	case 2:
		//...;
		break;
	case 3:
		//...;
		break;
	default:
		assert false:"x value is invalid:"+x;
		break;
}

假设x值为0且不可能为负,x出现负值时程序肯定错误。若代码中用断言,保证x出现负值时就会报告。


(3)什么情况下不要使用断言


1 作为公共方法的参数检查,永远要求执行。若用断言,在关闭断言时无法执行。


2 不要使用断言语句去修改变变量和改变方法的返回值。


小结:断言不应该用于验证程序的正确与否,而是验证方法是否满足预期结果。