1. 抛出异常
Java运行时系统引发的异常
根据需要人工创建并抛出
人工抛出异常(被抛出的必须是Throwable或其子类的对象)
语法格式:throw 异常类对象;
例如:IOException e = new IOException();
throw e;( 程序执行throw语句后立即终止,然后在包含它的所有try块中从里向外寻找含有与其类型匹配的catch子句。)
2. 声明抛弃异常
µ 如果一个方法中的代码在运行时可能生成某种异常,但是在本方法中不必要,或者不能确定如何处理此类异常时,则可以使用throws声明抛弃异常;
µ 表明该方法中将不对此类异常进行处理,而由该方法的调用者负责处理;
µ 即系统将在调用该方法的上层方法体内寻找合适的异常处理代码,而不再继续执行该方法的正常处理流程。
µ 声明抛弃异常的格式
类型 方法名([参数表]) throws 异常类型,…{
//方法体;
}
3. 虽然Java的内置异常处理能够处理大多数常见错误,但用户仍需建立自己的异常类型来处理特殊情况。这时可以通过创建Exception的子类来定义自己的异常类。
格式:class 类名 extendsException{
… … }
分析:Exception类自己没有定义任何方法。但它继承了Throwable提供的一些方法。 例如,
public StringgetMessage(); public voidprintStackTrace();
4. 在Java中,对异常进行处理需要考虑以下因素:
µ 如果异常事件是在运行时产生的,并且在JDK API中没有与该异常事件相对应的异常对象,则应创建用户自定义类型的异常对象。
µ 如果可以预测异常对象的类型并且该异常是在程序运行时发生的,则建议应用JDKAPI中定义的系统异常类型,并且可以抛出这种类型的异常对象由JVM处理。
µ 如果不能确定异常对象的类型以及异常发生的时机,则应该采用系统类型异常对象并由JVM处理。
µ 对应用程序设计失误导致的数组越界、非法变量等类型的异常,如果要全部捕获所有类型的异常对象,会增加系统开销,导致程序的运行效率降低,建议应用程序可以不对此类异常进行捕获,而交由JVM进行处理。
µ 对于实现输入/输出处理、网络通讯和数据库访问功能的代码,必须进行异常对象的捕获和处理 。
5. 从JDK1.4版本开始,Java语言引入了断言(assert)机制。
目的:程序调试(测试代码或者调试程序时,总会做出一些假设,断言就是用于在代码中捕捉这些假设 )
表现形式:断言就是程序中的一条语句,它对一个boolean表达式进行检查(一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态,系统给出警告或退出)
6. 如果没有断言机制,Java程序通常使用if-else或switch语句进行变量状态检查。缺点:
µ 由于检查的数据类型不完全相同,这样的语句形式不会统一。
µ 因为检查仅仅是应用在测试阶段,而if-else或switch语句在发布以后仍然将起作用,如果消除这些代码就意味着要注释或者删除这些代码,如果这些代码量很大就意味着工作很繁重并存在风险。
使用断言的优点:
µ Java程序员用统一的方式处理状态检查问题;
µ 断言只需在发行的时候关闭该功能即可。
7. 断言的开启和关闭
µ 在默认情况下断言是关闭的,因此在使用断言以前,需要先开启断言功能,方法:
java –eaMyClass 或者
java –enableassertions MyClass
µ 关闭断言功能的方法:
java –daMyClass 或者
java –disableassertions MyClass
µ 注意:断言检查通常在开发和测试时开启。为了提高性能,在软件发布后,断言检查通常是关闭的。
8. 断言的使用
Java中使用关键字assert标记断言,语法格式为:
µ assert Expression1
执行到assert语句时,如果Expression1的值为true,则程序正常执行,如果值为false,该语句创建一个Assertion Error对象,并抛出该对象。
µ assert Expression1:Expression2
当断言失败时,系统会自动将Expression2的值传递给新建的AssertionError对象,进而将其转换为一个消息字符串保存起来,可以获得更多、更有针对性的检查失败细节信息。
注意:这两种格式都必须是boolean表达式
9. 什么时候使用断言
µ 通常来说,断言用于检查一些关键的值,并且这些值对整个程序,或者局部功能的完成有很大的影响。
µ 断言表达式应该短小、易懂,如果需要评估复杂的表达式,应该使用函数计算。
µ 使用断言的情况
ü 检查控制流:在if-else和switch语句中,可以在不应该发生的控制支流上加上assert语句。如果这种情况发生了,assert能够检查出来。
ü 在私有方法计算前,检查输入参数是否有效
对于一些private的方法,要求输入满足一些特定的条件,可以在方法开头使用assert进行参数检查;对于公共方法,通常不使用断言检查
ü 在方法计算后,检查方法结果是否有效
ü 检查程序不变量
有些程序存在一些不变量,可能是一个简单表达式,也可能是一个复杂表达式。在程序的运行声明周期,这些不变量的值都是不变的,对于一些关键得不变量,可以通过assert进行检查。
private boolean isBalance() {
……
}//assert isBalance():"balance is destoried";
10. ThrowableInstance是Thowable或Thowable子类的一个对象,简单类(如int、char)以及非Throwable类(如String、Object)不能再thow语句中。
程序执行到thow语句后会立即终止,后面的语句不再被执行,然后在包含它的try块中从里向外寻找含有与其类型匹配的catch子句。
Java内置的运行异常都有两个构造方法,一个没有参数,一个带有一个字符串参数。当使用第二种形式时,参数指定描述异常的字符串。如果异常对象用作print()或println()的参数,则该字符串被显示。
如果一个方法可能导致,某个异常但不准备处理它时,就必须指定某种行为以使方法的调用者可以保护他们,要做到这点,必须在方法声明中包含一个throw子句。throw子句通常列举了一个方法可能引发的所有异常类型。这对于除Error、RuntimeException及其子类之外的所有其他异常都是很重要的。这些其他类型的异常必须在throw子句中声明,如果不这样做,将会导致编译错误。