在Java程序设计语言中,异常对象都是派生与Throwable类的一个类实例。
所有的异常都是有Threwable继承而来,但在下一层立即分解为两个分支:Error和Exception。
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。
Exception分成两个分支Runtimeable和IOException
以下4中情况会抛出异常:
调用了一个抛出检查型异常的方法,例如,FileInputStream构造器
检测到一个错误,并且利用throw语句抛出一个检查型异常
程序出现错误,例如,a[-1]=0会抛出一个非检查型异常
Java虚拟机或运行时库出现内部错误。
要想捕获一个异常,需要设置try/catch语句块。
try{
code}catch(ExceptionType e){
handler for this type
}
如果try语句块中的任何代码抛出了catch子句中指定的一个异常类,那么
程序将跳过try语句块的其余代码。
程序将执行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语句
代码没有抛出异常。在这种情况下,程序首先执行try语句块中的全部代码,然后执行finally子句中的代码。随后,继续执行finally子句之后的第一条语句。执行顺序1、2、5、6
代码抛出一个异常,并在一个catch子句中捕获。在上面的示例中就是IOException异常。在这种情况下,程序将执行try语句块中的所有代码,直到抛出异常为止。此时,将跳出try语句块中的剩余代码,转去执行与该异常匹配的catch子句中的代码,最后执行finally子句中的代码。
如果catch子句抛出一个异常,异常将被抛出到这个方法的调用者。执行顺序则只是1、3、5。
如果catch子句没有抛出异常,程序将执行finally子句之后的第一条语句。执行顺序是1、3、4、5、6。
代码抛出一个异常,但没有任何catch子句捕获这个异常。在这种情况下,程序将执行try语句块中所有语句,直到抛出异常为止。此时,将跳过try语句块中的剩余代码,然后执行finally子句中的语句,并将异常抛回给这个方法的调用者。执行顺序是1、5。
在一个具有自我保护能力的程序中,断言很常用。
断言机制允许在测试期间向代码中插入一些检查,而在生产代码中会自动删除这些检查。
关键字assert,两种形式:
assert condition ;
assert condition :expression ;
日志API主要优点:
可以很容易地取消全部日志记录,或者仅仅取消某个级别以下的日志,而且可以很容易地再次打开日志开关。
可以很简单地禁止日志记录,因此,将这些日志代码留在程序中的开销很小。
日志记录可以被定向到不同的处理器,如在控制台显示、写至文件,等等。
日志记录器和处理器都可以对记录进行过滤。过滤器可以根据过滤器实现器指定的标准丢弃那些无用的记录项。
日志记录可以采用不同的方式格式化,例如,纯文件或XML。
应用程序可以记录使用多个日志记录器,它们使用与包名类似的层次结构的名字,例如,com.mycompany.myapp。
日志系统的配置由配置文件控制。