异常与断言
掌握分析与学习目的
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 不要使用断言语句去修改变变量和改变方法的返回值。
小结:断言不应该用于验证程序的正确与否,而是验证方法是否满足预期结果。