文章目录
7.1 处理错误
1. 异常的概念:
在 Java 中, 如果某个方法不能够采用正常的途径完整它的
任务, 就可以通过另外一个路径退出方法 。 在这种情况下 , 方法并不返回任何值 ,而是抛出( throw ) 一个封装了错误信息的对象。
需要注意的是 , 这个方法将会立刻退出 , 并不返回任何值。 此外 , 调用这个方法的代码也将无法继续执行 , 取而代之的是 , 异常处理机制开始搜索能够处理这种异常状况的异常处理器 (exception handler )
Error 和 Exception
Error 类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误 。 应用程序不应该抛出这种类型的对象 。 如果出现了这样的内部错误 , 除了通告给用户, 并尽力使程序安全地终止之外 , 再也无能为力了。 这种情况很少出现 。
Exception
- RuntimeException 程序本身错误导致的异常(未受查异常)
- 其他异常(受查异常)程序本身没有问题 , 像 I / O 错误这类问题导致的异常属于其他异常 。
Java 语 言 规 范 将 派 生 于 Error 类 或 RuntimeException 类的所有异常称为非受查( unchecked ) 异常, 所有其他的异常称为受查 ( checked )异常。
这是两个很有用的术语 , 在后面还会用到 。 编译器将核查是否为所有的受査异常提供了异常处理器。
注释 : RuntimeException 这个名字很容易让人混淆。
实际上, 现在讨论的所有错误都发生在运行时
2. 声明受查异常
1 ) 调用一个抛出受査异常的方法 , 例如 , FilelnputStream 构造器。
2 ) 程序运行过程中发现错误 , 并且利用 throw 语句抛出一个受查异常 ( 下一节将详细地介绍 throw 语句 ) 。
3 ) 程序出现错误 , 例如, a [ - l ] = 0 会抛出一个ArraylndexOutOffloundsException 这样的非受查异常。
4 ) Java 虚拟机和运行时库出现的内部错误
如果出现前两种情况之一, 则必须告诉调用这个方法的程序员有可能抛出异常 。 为什么 ? 因为任何一个抛出异常的方法都有可能是一个死亡陷阱。 如果没有处理器捕获这个异常, 当前执行的线程就会结束 。
但是 , 不需要声明 Java 的内部错误, 即从Error 继承的错误。 任何程序代码都具有抛出那些异常的潜能 , 而我们对其没有任何控制能力。
同样, 也不应该声明从 RuntimeException 继承的那些非受查异常 0。
class MyAnimation
{
void drawlmage ( int i ) throws ArraylndexOutOfBoundsException // bad style
}
总之
, 一个方法必须声明所有可能抛出的受查异常 , 而非受查异常要么不可控制 (Error ) ,要么就应该避免发生 ( RuntimeException ) 。 如果方法没有声明所有可能发生的受查异常 , 编译器就会发出一个错误消息.
在Java中 , 没有 throws 说明符的方法将不能抛出任何受查丼常
7.2 捕获异常
1. 如何抛出异常
2. finally子句:再次抛出异常
InputStreai in = . .
try{
code that might throw exceptions
}
finally
{
in.close() ;
}
InputStream in = . . . ;
Exception ex = null ;
try{
try{
code that might throw exceptions
}
catch ( Exception e ){
throw e ;
}
}
finally
{
try{
in.doseO ;
}
catch ( Exception e )
{
if ( ex = null ) throw e
}
}