异常知识1

人们在遇到错误时会感觉不爽。如果一个用户在运行程序期间,由于程序的错误或一些

外部环境的影响造成用户数据的丢失,用户就有可能不再使用这个程序了, 为了避免这类事

情的发生, 至少应该做到以下几点:

•向用户通告错误;

•保存所有的工作结果;

•允许用户以妥善的形式退出程序。

用户期望在出现错误时, 程序能够采用一些理智的行为。如果由于出现错误而使得某些操作没有完成, 程序应该:

•返回到一种安全状态,并能够让用户执行一些其他的命令;或者

•允许用户保存所有操作的结果,并以妥善的方式终止程序

异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理

器。为了能够在程序中处理异常情况, 必须研究程序中可能会出现的错误和问题, 以及哪类

问题需要关注。

\1. 用户输入错误

除了那些不可避免的键盘输人错误外, 有些用户喜欢各行其是,不遵守程序的要求。例

如, 假设有一个用户请求连接一个 URL,而语法却不正确。在程序代码中应该对此进行检

查, 如果没有检査,网络层就会给出警告。

\2. 设备错误

硬件并不总是让它做什么,它就做什么。打印机可能被关掉了。网页可能临时性地不能浏

览。在一个任务的处理过程中,硬件经常出现问题。例如,打印机在打印过程中可能没有纸了。

\3. 物理限制

磁盘满了,可用存储空间已被用完。

\4. 代码错误

程序方法有可能无法正确执行。例如,方法可能返回了一个错误的答案,或者错误地调

用了其他的方法。计算的数组索引不合法, 试图在散列表中查找一个不存在的记录, 或者试

图让一个空找执行弹出操作,这些都属于代码错误

“ 如果出现 RuntimeException 异常, 那么就一定是你的问题” 是一条相当有道理的规则。

应该通过检测数组下标是否越界来避免 ArraylndexOutOfBoundsException 异常;应该通过在

使用变量之前检测是否为 null 来杜绝 NullPointerException 异常的发生:

Java 语 言 规 范 将 派 生 于 Error 类 或 RuntimeException 类的所有异常称为非受查

( unchecked ) 异常,所有其他的异常称为受查( checked) 异常。这是两个很有用的术语,在后面还会用到。 编译器将核查是否为所有的受査异常提供了异常处理器。

注释: RuntimeException 这个名字很容易让人混淆。 实际上,现在讨论的所有错误都发生在运行时。

在自己编写方法时, 不必将所有可能抛出的异常都进行声明。至于什么时候需要在方法

中用 throws 子句声明异常, 什么异常必须使用 throws 子句声明, 需要记住在遇到下面 4 种

情况时应该抛出异常:

1 ) 调用一个抛出受査异常的方法, 例如, FilelnputStream 构造器。

2 ) 程序运行过程中发现错误, 并且利用 throw语句抛出一个受查异常(下一节将详细地

介绍 throw 语句)。

3 ) 程序出现错误, 例如,a[-l]=0 会抛出一个 ArraylndexOutOffloundsException 这样的

非受查异常。

4 ) Java 虚拟机和运行时库出现的内部错误。

如果出现前两种情况之一, 则必须告诉调用这个方法的程序员有可能抛出异常。 为什

么? 因为任何一个抛出异常的方法都有可能是一个死亡陷阱。 如果没有处理器捕获这个异

常,当前执行的线程就会结束。

对于那些可能被他人使用的 Java 方法, 应该根据异常规范( exception specification), 在

方法的首部声明这个方法可能抛出的异常。

但是, 不需要声明 Java 的内部错误,即从 Error 继承的错误。任何程序代码都具有抛出那些

异常的潜能, 而我们对其没有任何控制能力。

同样,也不应该声明从 RuntimeException 继承的那些非受查异常

这些运行时错误完全在我们的控制之下。如果特别关注数组下标引发的错误,就应该将

更多的时间花费在修正程序中的错误上,而不是说明这些错误发生的可能性上。

总之,一个方法必须声明所有可能抛出的受查异常, 而非受查异常要么不可控制( Error),

要么就应该避免发生( RuntimeException)。如果方法没有声明所有可能发生的受查异常, 编

译器就会发出一个错误消息。

警告: 如果在子类中覆盖了超类的一个方法, 子类方法中声明的受查异常不能比超类方法中声明的异常更通用 (也就是说, 子类方法中可以抛出更特定的异常, 或者根本不抛出任何异常)。特别需要说明的是, 如果超类方法没有抛出任何受查异常, 子类也不能抛出任何受查异常。例如, 如果覆盖 JComponent.paintComponent 方法, 由于超类中这个方

法没有抛出任何异常,所以, 自定义的 paintComponent 也不能抛出任何受查异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值