读《Java核心技术 卷I》第七章 异常、断言和日志

第七章 异常、断言和日志

异常

在Java程序设计语言中,异常对象都是派生与Throwable类的一个类实例。

所有的异常都是有Threwable继承而来,但在下一层立即分解为两个分支:Error和Exception。

Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。

Exception分成两个分支Runtimeable和IOException

throws异常抛出

以下4中情况会抛出异常:

  • 调用了一个抛出检查型异常的方法,例如,FileInputStream构造器

  • 检测到一个错误,并且利用throw语句抛出一个检查型异常

  • 程序出现错误,例如,a[-1]=0会抛出一个非检查型异常

  • Java虚拟机或运行时库出现内部错误。

异常捕获

要想捕获一个异常,需要设置try/catch语句块。

try{

code}catch(ExceptionType e){

handler for this type

}

如果try语句块中的任何代码抛出了catch子句中指定的一个异常类,那么

  1. 程序将跳过try语句块的其余代码。

  2. 程序将执行catch子句中的处理器代码。

如果try语句中的代码没有抛出任何异常,那么程序将跳过catch子句。

不管是否有异常被捕获,finally子句中的代码都会执行。

var in =new FileInputStream;

try{

// 1

code that might thorw exceptions

//2 }catch(IOException e){

// 3

show error message

//4 }

finally{

//5

in.close;

}

//6

这个程序可能在以下3种情况执行finally语句

  1. 代码没有抛出异常。在这种情况下,程序首先执行try语句块中的全部代码,然后执行finally子句中的代码。随后,继续执行finally子句之后的第一条语句。执行顺序1、2、5、6

  2. 代码抛出一个异常,并在一个catch子句中捕获。在上面的示例中就是IOException异常。在这种情况下,程序将执行try语句块中的所有代码,直到抛出异常为止。此时,将跳出try语句块中的剩余代码,转去执行与该异常匹配的catch子句中的代码,最后执行finally子句中的代码。

    如果catch子句抛出一个异常,异常将被抛出到这个方法的调用者。执行顺序则只是1、3、5。

    如果catch子句没有抛出异常,程序将执行finally子句之后的第一条语句。执行顺序是1、3、4、5、6。

  3. 代码抛出一个异常,但没有任何catch子句捕获这个异常。在这种情况下,程序将执行try语句块中所有语句,直到抛出异常为止。此时,将跳过try语句块中的剩余代码,然后执行finally子句中的语句,并将异常抛回给这个方法的调用者。执行顺序是1、5。

断言

在一个具有自我保护能力的程序中,断言很常用。

断言机制允许在测试期间向代码中插入一些检查,而在生产代码中会自动删除这些检查。

关键字assert,两种形式:

assert condition ;

assert condition :expression ;

日志

日志API主要优点:

  • 可以很容易地取消全部日志记录,或者仅仅取消某个级别以下的日志,而且可以很容易地再次打开日志开关。

  • 可以很简单地禁止日志记录,因此,将这些日志代码留在程序中的开销很小。

  • 日志记录可以被定向到不同的处理器,如在控制台显示、写至文件,等等。

  • 日志记录器和处理器都可以对记录进行过滤。过滤器可以根据过滤器实现器指定的标准丢弃那些无用的记录项。

  • 日志记录可以采用不同的方式格式化,例如,纯文件或XML。

  • 应用程序可以记录使用多个日志记录器,它们使用与包名类似的层次结构的名字,例如,com.mycompany.myapp。

  • 日志系统的配置由配置文件控制。

  •  

上一篇:java基础:异常处理和泛型


下一篇:09异常处理