第8 章 java 异 常处理download.hqyj.com/download/ebooks/farsight-androidjava... · 2017. 8....
TRANSCRIPT
�
�
本
来捕获
如何自
8.1
8.1.1
没
照你的
件一定
母甚至
可能地
要等到
但
说,答
些都替
在
E
于这种
它处理
在开平
取网络
8.1.2
在
Throw
本章介绍异常
获异常,如何
自定义异常的
异常概
知识准备
没有人敢保证
的意愿来执行
定会在它应该
至更奇怪的符
地考虑用户各
到出了问题再
但是,且慢,
答案也许是的
替你考虑到了
在 Java 中,有
Error 处理的是
种类型错误,
理的是因为程
平方的方法中
络问题等,都
2 知识准备
在 Java 中,
wable 类的子
华
第 8 章
常的基本概念
何通过 throw 将
的方法,以及
概述
备:异常的
证自己写的程
行程序。比如
该存在的位置
符号。作为程
各种不规范的
再去补救。 我们需要针
的,或许也没
了。 有两个类用于
是 Java 运行
程序基本上
程序设计的瑕
中输入了一个
都可以通过 E
备:Error/E
异常对象分
子类。Error 类
华清远见�—
www
章 Ja
念,Java 中异
将异常抛给调
及通过 printSt
的概念
程序永远没有
如,不要指望
置,不要指望
程序设计人员
的输入、尽可
针对每一个错
没有这么糟糕
于处理错误:
环境中的内部
是无能为力的
瑕疵而引起的
个负数,对一
Exception 来处
Exception 层
为两大类:E
类只有四个子类
高端 IT 就业
w.embedu.or
ava 异
常的层次关系
调用方法,如
tackTrace()方
有错,即使写
望用户的网络
望用户一定会
员,你应该尽
可能地考虑运
错误去编写错
糕,而对于 Ja
Error 和 Ex
部错误或者硬
的,除了退出
的问题或者外
一个为空的对
处理。
层次关系
Error 和 Exc
类:AWTErr
业培训专家�
rg
异常处理
系,还介绍了
如何在进行方
方法追踪异常
写的程序没有
络是畅通的,
会在需要数字
尽可能多地想
运行环境的恶劣
错误处理程序
ava,答案是
xception。 硬件问题,比
出运行外别无
外在的输入等
对象进行操作
ception。Erro
ror、LinkageE
理
了如何通过 tr
方法覆盖的时
常的源头的方
有错,也不要
不要指望你
字的地方输入
想象可能会碰
劣,所谓“有
序吗?对于某
“否”,基本
比如,内存资
无他法。而对于
引起的一般性
作以及网络不
or 类和 Exc
Error、Virtua
ry-catch-final
候处理异常
方法。
指望用户能按
需要的某个文
数字而不是字
到的错误、尽
有备无患”,不
些编程语言来
上,Java 将这
资源不足等。对
于 Exception,
性问题,例如
稳定引起的读
ception 类都是
alMachineErr
lly
,
按
文
字
尽
不
来
这
对
,
如:
读
是
ror
�
�
172 4
以及
情况,
Excep
运行时
过程中
起 Ru
引
其
8.1.3
示
源
pub
p
}
}
在
期望用
用户会
下的命
jav
这
Exc
ThreadDeath
这种情况是
ption 的子类就
时的异常 Ru
中的不周全的
ntimeExcepti
错误的类
数组越界
数学计算
试图访问
引起 IOExcep
试图从文
试图打开
其他比较常见
用 Class.
其他原因
3 任务一:
示例 8-1:数
源文件:Except
blic class Ex
ublic static
int a, b;
double c;
a = Integ
b = Integ
c = a / b
System.ou
在这个程序中
用户总是能输
会输入一个 0
命令来执行这
va ExceptionE
这个时候,我
ception in th
at Excep
华
h,正如前面所
是程序员所无
就很多了,可
untimeExcepti
的代码引起的
ion 异常的原
类型转换。
界访问。
算错误。
问一个空对象
ption 异常的
文件结尾处读
开一个不存在
见的异常原因
.forName()来
因。
数学计算
数学计算异常
tionExam.java
xceptionExam
void main(S
;
;
ger.parseInt(
ger.parseInt(
b;
ut.println(a
中,我们从控
输入两个正确
0 来作为除数
这个程序:
Exam 12 0
我们就会从控
hread "main"
ptionExam.mai
华清远见�—
www
所述,它处理
无法掌握的,
可以大致将它
ion 以及其他
的,而 IOExc
原因包括如下
象。
原因包括:
读取信息。
在或者格式错
因可能是:
来初始化一个
算异常示例
。
a
{
tring args[]
(args[0]);
(args[1]);
+ "/" + b +
控制台接收两
确的操作数,
数,这个时候
控制台得到一
java.lang.Ar
in(ExceptionE
高端 IT 就业
w.embedu.or
理的是 Java
,我们只有通
它的子类分为
他的异常。R
ception 是由于
下几种:
错误的 URL。
个类的时候,
) {
" = " + c);
两个参数,并
但是,现实
候,情况就不
一个异常信息
rithmeticExce
Exam.java:10)
业培训专家�
rg
运行系统中
通知用户并安
为 3 类:有关
RuntimeExcep
于 IO 系统出
字符串参数对
并对它们进行
实总不是你想
不如你想象的
息:
eption: / by
)
中的内部错误
安全退出程序
关 I/O 的 IOEx
piton 异常是
出现阻塞等原
对应的类不存
行一个除法运
想象中的那么
的那样了,比
zero
及资源耗尽等
序的运行。而
xception、有关
由于程序编写
因引起的。引
存在。
算,你或许会
美好。也许,
如用户输入如
等
而
关
写
引
会
,
如
�
�
在
Runtim
8.1.4
示
源
pub
p
}
}
这
台上得
Exc
在
量调用
Runtim
当
进行判
为 nu
共同的
计阶段
能就需
还
户可能
必须使
序的时
8.1.5
示
源
pub
p
在这个例子
meException
4 任务二:
示例 8-2 访
源文件:Except
blic class Ex
ublic static
java.util
System.ou
这个程序很简
得到如下的信
ception in th
at Excep
在这个程序中
用 Date 对象
meException
当然,上面这
判断,如判断
ull,再决定是
的父类 Runti
段,但在一些
需要使用 Jav
还有一些异常
能输入的 url
使用 Java 的异
时候,编译器
5 任务三:
示例 8-3 访
源文件:Except
blic class Ex
ublic static
java.util
华
中,可能会
(Arithmetic
访问空对
访问空对象引起
tionExam1.jav
xceptionExam1
void main(S
l.Date d = nu
ut.println(d.
简单,就是试
信息:
hread "main"
ptionExam1.ma
中,我们没有
象中的方法
(NullPointe
这两个程序是
断除数参数是
是否调用这个
imeException
些更复杂的应
va 的异常处理
常,我们无法
地址作一个准
异常处理机制
器会强制让你
访问文件
访问文件异常
tionExam1.jav
xceptionExam1
void main(S
l.Date d = nu
华清远见�—
www
会因为用户输
cException 是
对象引起的异
起的异常
va
1 {
tring args[]
ull;
.getTime());
试图从一个 D
java.lang.Nu
ain(Exception
有给引用变量
法时,将会出
erException 也
是很容易避免
是否为 0,若为
个对象的方法
n。虽然我们
应用中,我们
理机制来对这
法通过程序的
准确的判断,
制来进行处理
你必须进行处
件异常示例
。
va
1 {
tring args[]
ull;
高端 IT 就业
w.embedu.or
输入的数据而
是 RuntimeEx
异常示例
) {
Date 对象中得
ullPointerExc
nExam1.java:6
量一个真正的
出现一个“空
也是 Runtime
免这种错误的
为 0,就不进
法。这种异常
们可以通过程
们常常无法避
这些情况进行
的控制来避免
,以决定是否
理。如果没有
处理。例如,
) {
第
业培训专家�
rg
而引起数学
xception 的子
得到时间。运
ception
6)
Date 对象。
空指针引用
eException 的
的,我们完全
进行除法运算
常通常都是运
程序的控制来
避免类似这种
行处理了。
免它的出现,
否进行网络连
有使用 Java 的
我们来看下
8 章 Java 异
学计算的错误
子类)异常。
运行这个程序
因此,当试
用”的异常。
的子类)异常
全可以在调用
算;或者首先
运行时异常,
来将这种异常
种情况的出现
比如,我们
连接等,这个
的异常处理机
面这个程序
异常处理
174
误,它是一个
序,将会在控制
图通过这个变
它也是一个
常。
它的方法之前
判断对象是否
它们都有一个
扼杀在程序设
。这个时候可
不太可能将客
个时候,我们就
机制,在编译程
。
734
个
制
变
个
前
否
个
设
可
客
就
程
�
�
174 4
}
}
这
台上得
Exc
在
量调用
Runtim
当
判断,
null,
的父类
段,但
需要使
还
户可能
就必须
程序的
8.2
8.2.1
T
称做一
计算机
之间进
程序提
数据,
数据的
能够保
8.2.2
System.ou
这个程序很简
得到如下的信
ception in th
at Excep
在这个程序中
用 Date 对象
meException
当然,上面这
如判断除数
再决定是否调
类 RuntimeE
但在一些更复
使用 Java 的异
还有一些异常
能输入的 UR
须使用 Java 的
的时候,编译
Java 中
知识准备
TCP(Transm
一种可靠的端
机需要与另一
进行面向连接
提供可靠的通
进行数据内
的正确性,不
保证通信的可
2 知识准备
华
ut.println(d.
简单,就是试
信息:
hread "main"
ptionExam1.ma
中,我们没有
象中的方法
(NullPointe
这两个程序是
数参数是否为
调用这个对象
Exception。虽
复杂的应用中
异常处理机制
常,我们无法
RL 地址作一个
的异常处理机
译器会强制让
中异常的处
备:常见异
mission Contr
端对端协议。
一台远程计算
接的传输。传
通信连接,使
内容准确性检
不出现丢失或
可靠。
备:Java 中
华清远见�—
www
.getTime());
试图从一个 D
java.lang.Nu
ain(Exception
有给引用变量
法时,将会出
erException 也
是很容易避免
为 0,若为 0
象的方法。这
虽然我们可以
中,我们常常
制来对这些情
法通过程序的
个准确的判断
机制来进行处
让你必须进行
处理
异常
rol Protocol)
这是因为它
算机连接时,
传输控制协议
使它能够自动
检查并保证分
或乱序。因此
中的异常处
高端 IT 就业
w.embedu.or
Date 对象中得
ullPointerExc
nExam1.java:6
量一个真正的
出现一个“空
也是 Runtime
免这种错误的
0,就不进行
这种异常通常
以通过程序的
常无法避免类
情况进行处理
的控制来避免
断,以决定是
处理。如果没
行处理。例如
)是应用于运
它为两台计算
TCP 协议会
议 TCP 协议利
动适应网上的
分组的正确顺
此即使在 Inte
理机制
业培训专家�
rg
得到时间。运
ception
6)
Date 对象,
空指针引用
eException 的
的,我们完全
行除法运算;
常都是运行时
的控制来将这
类似这种情况
理了。 免它的出现,
是否进行网络
没有使用 Java
如,我们来看
运输层的传输
算机之间的连
会让它们建立
利用重发技术
的各种变化。
顺序。使传输
ernet 暂时出
运行这个程序
因此,当试
用”的异常。
的子类)异常
全可以在调用
或者首先判
时异常,它们
这种异常扼杀
况的出现。这
比如,我们
络连接等,这
a 的异常处理
下面这个程序
输控制协议
连接起了重要
立一个连接,
术和拥塞控制
TCP 重发一
输具有高可靠
现堵塞的情
序,将会在控制
图通过这个变
它也是一个
常。
它的方法之前
断对象是否为
都有一个共同
在程序设计阶
个时候就可能
不太可能对客
这个时候,我们
理机制,在编译
序。
。TCP 协议被
作用:当一台
在两台计算机
制机制,向应用
切没有收到的
性,确保传输
况下,TCP 也
制
变
个
前
为
同
阶
能
客
们
译
被
台
机
用
的
输
也
�
�
J
交给 J
当
象交给
如
程序也
正
为力。
8.2.3
如
止运行
栈(St
那么,
运行。
捕获的
try
/
}[c
/
}ca
//如
}]
/
}]
也
t
t
t
通
另外还
件执行
异
嵌套使
将
代码也
c
多个异
ava 程序在执
Java 运行时环
当 Java 运行时
给其处理,这
如果 Java 运行
也将退出。
正如我们前面
3 知识准备
如果一个非图
行并且在控制
tack)内容的
它也将在控
所以,对于
的异常进行处
y{
/ 可能会抛出特定
catch(MyExcep
/ 如果 myExcep
atch(Exceptio
如果另外的异常 o
[finally{
/无条件执行的语
也就是说,对
ry…catch[…ca
ry…catch[…ca
ry…finally
通过 try-catch
还可以加入一
行。 异常处理可以
使用。
将可能出现异
也一并放到 tr
atch() 从句中
异常。
华
执行过程中如
环境,这个过
时环境接收到
这一过程称为
行时环境找不
面所言,程序
备:通过 tr
图形化的应用
制台(如果是
的信息。而如果
控制台中输出
于异常,需要
处理,在 Java
定异常的代码段
ptionType my
ption 被抛出,
on otherExcep
otherExceptio
语句
对于异常的处
tch…]
tch…]…finall
h 语句,可以
一个 finally 子
以定义在方法
异常的代码都
ry 代码块中
中引入一个可
华清远见�—
www
如出现异常,
过程称为抛出
到异常对象时
为捕获(catch
不到可以捕获
序员通常只能
ry…catch…
用程序发生了
是用控制台启
果一个图形化
出一条包含异
要作出相应的
a 中可以通过
yException){
则执行这段代码
ption){
on被抛出,则执
处理语句可能
y
将可能出现的
子句,在 fina
法体、自由块
都放在 try 代码
。
可能出现的异
高端 IT 就业
w.embedu.or
会自动生成
出(throw)异
时,会寻找能
h)异常。
获异常的方法
能处理异常(
…finally 来处
了异常,并且
启动的应用的
化的应用程序
异常类型和异
的处理。其中
过 try-catch-fi
执行这段代码
能为下面 3 种
的异常通过 c
ally 子句中的
块或构造器中
码块中,当然
异常,一个 tr
第
业培训专家�
rg
成一个异常类
异常。
能处理这一异
法,则运行时
(Exception)
处理异常
且异常没有被
的话)输出一
序发生了异常
异常堆栈内容
中一种方法就
inally 语句来
种中的一种:
catch()子句捕
的代码段无论
中,并且,try
然,也可以将
try 块可以和
8 章 Java 异
类对象,该异
异常的代码并
时环境将终止
,而对错误
被处理,那么
一条包含异常
常,并且异常
容的信息,但
就是将异常捕
来捕获异常:
捕获并在相应
论是否发生异
y…catch…fin
将其他一些不
多个 catch()
异常处理
174
常对象将被提
把当前异常对
,相应的 Jav
(Error)无能
,程序将会中
类型及异常堆
没有被处理,
程序不会中止
获,然后对被
应的地方处理
常都将被无条
nally 语句可
会引起异常的
块配合以处理
754
提
对
va
能
中
堆
,
止
被
理,
条
以
的
理
�
�
176 4
当
终止执
获得异
无
无论程
数据库
法中的
义在 t
将资源
行到。
下
示
源
imp
pub
p
}
}
这
FileNo
行各自
我
序,将
Fil
这
转到 c
当 try 块内的
执行,并跳到
异常的详细信
无论是否出现
程序如何运行
库连接、打开
的未执行的代
try 从句中的
源回收的动作
下面我们来看
示例 8-4:使
源文件:CatchE
port java.io.
blic class Ca
ublic static
try {
File
int
b =
whil
}
fis.
} catch (
Syst
} catch (
Syst
}
这个例子是前
otFoundExce
自 catch()代码
我们将指定的
将会在控制台
leNotFoundExc
这说明,在执
catch(FileNot
华
的任何代码抛
到相应的 catc
信息或者通过
现异常,程序
行,它都必然会
开一个文件、
代码将会中止
的资源回收动
作放到 finally
看一个使用 tr
使用 try…catch
Exception.java
.*;
atchException
void main(S
eInputStream
b;
fis.read();
le (b != -1)
System.out.
b = fis.rea
.close();
(FileNotFound
tem.out.print
(IOException
tem.out.print
前面的Except
eption 和 IOE
码段中的代码
的文件(此处
台上得到类似
ception:c:\a.
执行这个程序
tFoundExcep
华清远见�—
www
抛出了由 catch
ch()代码块中
过 printStackT
序 后都会执
会被执行到。
网络连接等
止执行,并转
作就不会执行
y 从句中来执
ry…catch 执行
h 捕获异常。
a
n {
tring[] args
fis = new Fi
{
print((char)
ad();
dException e)
tln("FileNotF
e1) {
tln("IOExcept
tionExam2的
Exception。如
码:都是通过
处是 C 盘下的
似如下的结果
.txt (系统找不
序的时候,发
ption)指定的代
高端 IT 就业
w.embedu.or
h() 子句指定
中执行。可以
Trace()方法跟
执行 finally 代
。如果在 try 从
等),然后,方
转而执行 catc
行了,这就会
执行,这样,
行异常捕获的
) {
ileInputStrea
b);
) {
FoundExceptio
tion:" + e1.g
的完整版本。在
如果出现了这
过 getMessage
的 a.txt)删除
果:
不到指定的文件。
发生了 FileNo
代码段中执行
业培训专家�
rg
定的异常,则
通过 Except
跟踪异常事件
代码块中的内
从句中给方法
方法出现异常
ch()从句中的
会导致资源没
无论是否会
的例子。
am("c:/a.txt"
on:" + e.getM
getMessage())
在这个程序中
这两个异常的
e()方法来得到
除或改成其他
)
otFoundExcep
行了。
则 try 代码段
ion 的 getMe
件发生时执行
内容。finally
法分配了一些
常,它将抛出
的内容。这个
没有被回收。
会有异常发生
");
Message());
);
中,必须要捕
的任何一个,
到出现异常的
他的名字,然
ption 异常,
中的程序将会
essage()方法来
行堆栈的内容
的意义在于,
些资源(比如,
一个异常,方
时候,本来定
此时,就可
,它都能被执
获两个异常:
系统都将会执
的详细信息。
后执行这个程
因此程序已经
会
来
容。
,
,
方
定
以
执
:
执
程
经
�
�
如
常,则
在
异常之
比如
FileNo
IOExc
放在前
句捕获
放在 I
Exc
1 e
但
中打开
闭:
fis
但
那么,
这样,
中,这
刚
异常的
打开,
一个并
语句来
下
实
源
imp
pub
p
如果指定的文
则程序将从文
在通过 catch
之间有继承关
,上面两个
otFoundExce
ception 之前
前面,程序运
获,那么,File
IOException
ceptionExam1.
c
error
但是,这个代
开了一个文件
s.close();
但是,如果在
方法将会退
方法占用的
这样,无论是
刚才讨论的是
的时候,会发
那么,如果
并不存在的文
来捕获这种异
下面我们来看
实例 8-5:使
源文件:CatchE
port java.io.
blic class Ca
ublic static
FileInput
try {
fis
int
b =
华
文件(C 盘下
文件“a.txt”
来捕获多个
关系,则应该
个异常 IOE
eption 是 IO
捕获,而将
运行的时候突
NotFoundEx
之后编译程序
.java:23: exc
atch(FileNot
码还有一些
件,这就占用
在方法的执行
出 try 从句中
的资源就无法
是否会发生异
是发生 IOExc
发生什么情况
果此时在 fina
文件流。因此
异常。事实上
看这个完整的
使用 try…catch
Exception.java
.*;
atchException
void main(S
tStream fis =
= new FileIn
b;
fis.read();
华清远见�—
www
下的 a.txt)存
中读出文件
异常时,越
该将子类的异
Exception 和
OException 的
IOException
突然碰到 File
xception子句
序将会出现下
ception java.
tFoundExcepti
问题,就是我
用了这个资源
行过程中发生
中语句的执行
法被释放。此
异常,它都会
ception异常的
况呢?如果发
ally 从句中执
此,在执行 fis
上,FileInputS
的程序。
h…finally 捕
a
n {
tring[] args
= null;
nputStream("c
高端 IT 就业
w.embedu.or
存在,并且在
内容并一行行
“具体”的异
异常放在前面
和 FileNotFo
的子类,所以
n 放在后面。
eNotFoundEx
就永远也不会
下面的错误:
.io.FileNotFo
on e)
我们前面讨论
源。在理想状
生了 IOExcep
行。那么,关闭
此时,可以通
会被执行,也
的情况,那么
发生 FileNotFo
执行 fis.close(
.close()的地方
Stream 的 clo
捕获异常。
) {
c:/a.txt");
第
业培训专家�
rg
在读取这个文
行地输出到控
异常放在越前
面,而将父类
oundExceptio
以只能将 Fil
。这主要是因
xception,它
会被执行了。
:
oundExceptio
论的关于资源
状态下,它应
ption(通常由
闭打开的文件
通过将关闭文
也就解决了资
,如果方法发
oundExceptio
()语句,肯定
方,也需要做
ose()方法必须
8 章 Java 异
文件的时候没
控制台中。 前面,也就是
类的异常放在
on 就存在
leNotFoundE
因为,如果将
它会被 IOExc
。将FileNotFo
n has alread
源回收的问题
应该在方法执
由于 fis.read(
件那条语句就
件的语句放到
源可能无法释
发生FileNotF
on 异常,也
定会出现问题
做异常处理:
须要对它作异
异常处理
174
有出现 I/O 异
是说,如果这些
后面来捕获。
继承关系,
xception 放在
将 IOExceptio
ception 这个子
oundExceptio
y been caught
:在方法 mai
行的 后被关
()引起)异常
不会被执行,
到 finally 从句
释放的问题。
oundExceptio
就没有文件被
:它试图关闭
使用 try-catc
异常处理。
774
异
些
。
,
在
on
子
on
ht
in()
关
常,
,
句
。
on
被
闭
ch
�
�
178 4
}
}
注
声明必
fis 是不
放到 t
另
上
的时候
示或者
执行的
而如果
知道程
另
很多
return
它就一
whil
}
// 移
// f
} catch (
Syst
} catch (
Syst
} finally
try
} ca
}
}
注意,在这个
必须从 try 从
不存在的,那
try 从句外面
另外,try 语句
注意:
千万不要对try{
…
}catch(Exce
{}
上面这段代码
候,如果程序
者其他处理,
的结果往往已
果在一个发布
程序出现了问
另外,如果方
Java 新手在
语句,就会
一定会被执行
华
le (b != -1)
System.out.
b = fis.rea
移到 finally从
fis.close();
(FileNotFound
tem.out.print
(IOException
tem.out.print
y {
{
if(fis != n
fis.clo
atch (IOExcep
System.out.
个程序中,如
从句中移出来
那么,在 fina
面,并且给它
句可以不用 c
对捕获的异常“不
eption e)
码中的 catch(
序出现了异常
程序中其他
已经不是你所
布的应用程序
问题,运行结
方法有返回值
在使用 try[…
会马上离开正
行。我们来考
华清远见�—
www
{
print((char)
ad();
从句中去执行
dException e)
tln("FileNotF
e1) {
tln("IOExcept
null)
ose();
ption ioe) {
println("关闭
如果将 fis.clo
来,因为如果
ally 中就不能
赋初始值 nu
catch 而直接
不作为”。也就是
()从句中,对
常,你也无法
他的语句就会
所期望的结果
序中出现这种
结果已经是不
值,那么,一
catch]…final
正在执行的方
考虑下面的代
高端 IT 就业
w.embedu.or
b);
) {
FoundExceptio
tion:" + e1.g
闭文件出错!");
se()语句移到
try 从句中的
能使用 fis 这个
ull。
接和 finally 结
是说,不要让 c
对捕获的异常
法知道,因为
会像没有发生
果了,这种做
种情况,用户
不正确的了。
一定要注意是
lly 来捕获异
法。而事实的
代码:
业培训专家�
rg
on:" + e.getM
getMessage())
到 finally 中去
的变量 fis 定
个变量,所以
结合使用处理
catch()从句中的
常什么都没有
为程序将异常
生异常一样继
做法往往给调
户也往往会得
是否在 try 和 f
异常的时候,
的真相是:如
Message());
);
去执行,那么
定义语句没有
以,需要将变
理异常情况。
的代码段是空的
有做,那么,
常捕获后,没
继续执行,但
调试程序带来
得到并不期望
finally 中都有
容易想当然
如果有 finall
么,变量 fis 的
被执行,变量
变量 fis 的声明
的:
当你调试程序
有做任何的提
是,这个时候
很大的困扰。
的结果,也不
有 return 语句
地认为只要有
ly 从句存在,
的
量
明
序
提
候
。
不
句,
有
,
�
�
pub
try
}
//c
//
//}
fin
{
}
}
案是 3
中的代
覆盖了
值的语
当
System
8.2.4
在
让调用
可
不
如
如
方
thr
}
前
之,就
Error,
常、检
blic int getI
y {
return 1;
catch(Excepti
return 2;
}
nally
return 3;
上面的 getIn
3。或许按照
代码,也就会
了 try 从句中
语句,如果有
当然,在一种
m.exit()语句的
4 知识准备
在定义一个方
用这个方法的
可以对下列情
(1)方法中
(2)程序运行
不要抛出如下
(1)从 Error
(2)从 Runt
如果一个异常
如果一个异常
方法中抛出异
<modifer>
rows <excepti
//…
前面已经说过
就是一个方法
应该通过程
检查数组大小
华
Int(){
;
ion e){
;
;
nt()方法将返
照你的设计,
会返回 try 中
的返回值 1。
有,应该删除
种情况下 fin
的时候,此时
备:将异常
方法的时候,
的代码来处理
情形在方法定
调用了一个会
行过程中发生
下异常:
r 中继承来的
timeExceptio
常没有在当前
常回到了 mai
异常的格式:
> <returnType
ion_list> {
过,哪种类型
法应该抛出它
程序来避免这
小避免数组越
华清远见�—
www
返回什么?(
你期望它返
的 return 值
。所以,一定
除或做其他妥
nally 不会被
时整个程序将
常抛出
可以不在方
理。这是通过
定义中抛出异
会抛出“已检
生了错误,并
的那些错误。
on 中派生的那
前的 try-catch
in()方法,仍
e> methodName
型的异常应该
它可能碰到的
这种情况的发
越界访问异常
高端 IT 就业
w.embedu.or
因为没有异
回 1(程序没
),但事实却
定要注意,在
妥善的处理。
被执行,那就
将退出执行,
方法体中对异
过所谓的“抛
异常:
检查异常”的
并且用 throw
那些异常,如
h 模块中得到
仍没有得到处
e([<argument_
该在方法中被
的所有的“已检
发生,比如,
常等。
第
业培训专家�
rg
异常会发生,所
没有异常发生
却非你想象,
在 finally 从句
就是在 try 从
finally 从句
异常进行处理
抛出异常”来
的方法。
w 子句抛出了
如 NullPointe
到处理,则会
理,则程序会
_list>])
被抛出,而哪
检查异常”,
检查对象引
8 章 Java 异
所以将 catch
生的时候,将
它的 finally
句中,是否有
从句或者 cat
句也就无法被
理,而是将可
实现的。
了一个“已检
erException 等
会抛出到它的调
会异常终止。
哪些不应该被
而对于“未
用是否为空
异常处理
174
h()注释了)答
将运行 try 从句
中的返回值
可能改变返回
tch()从句中有
被执行了。
能发生的异常
检查异常”。
等。
调用方法。 。
抛出。简而言
未检查异常”和
避免空指针异
794
答
句
值 3
回
有
常
言
和
异
�
�
180 4
示
源
imp
pub
p
}
p
}
}
在
FileNo
将这两
那么这
的调用
如果一
这
的方法
我
子句抛
示
源
imp
pub
p
示例 8-6:将
源文件:Throw
port java.io.
blic class Th
ublic void r
FileInput
int b;
b = fis.r
while (b
Syst
b =
}
fis.close
ublic static
ThrowExam
try {
te.r
} catch (
Syst
} catch (
Syst
}
在这个例子中
otFoundExce
两个异常抛出
这个时候就需
用者。但不建议
一个异常回到
这个例子是抛
法。
我们再来看一
抛出了一个“
示例 8-7:将
源文件:Throw
port java.io.
blic class Th
ublic void r
File f =
华
将方法中的异常
Exam.java
.*;
hrowExam {
eadFile() th
tStream fis =
read();
!= -1) {
tem.out.print
fis.read();
e();
void main(S
m te = new Th
readFile();
(FileNotFound
tem.out.print
(IOException
tem.out.print
中,定义了一
eption 和 IOE
出,让这个方
需要对它们进
议将异常抛给
到了 main()方
抛出异常中两
一下抛出异常
“已检查异常
将方法中的异常
Exam1.java
.*;
hrowExam1 {
eadFile() th
new File("c:
华清远见�—
www
常抛给调用者
hrows FileNot
= new FileInp
t((char) b);
tring[] args
hrowExam();
dException e)
tln("FileNotF
e1) {
tln("IOExcept
一个方法 read
Exception,我
方法的调用者
进行处理了。
给 main()方法
方法,仍没有
两种情形中的
常的另一个情
常”。
常抛给方法调
hrows FileNot
:/a.txt");
高端 IT 就业
w.embedu.or
者处理(情形
tFoundExcepti
putStream("c:
) {
) {
FoundExceptio
tion:" + e1.g
dFile(),用于
我们没有直接
来处理。比如
当然,也可
法的调用者来
有得到处理,
的一种:方法
情形:程序运
调用者处理
tFoundExcepti
业培训专家�
rg
形一)。
ion, IOExcept
:/a.txt");
on:" + e.getM
getMessage())
于读取指定文
接在这个方法
如,在 main()
可以将这两个
来处理。因为根
则程序会异常
法中调用了一
运行过程中发
(情形二)。
ion, IOExcept
tion {
Message());
);
文件的内容,
法中对它们进
)方法中调用
异常再抛出给
根据 Java 的
常终止。 一个会抛出“
发生了错误,
tion {
它可能会引起
进行处理,而是
了这个方法,
给 main()方法
调用栈机制,
已检查异常”
并且用 thro
起
是
,
法
,
”
ow
�
�
}
p
}
}
在
为 File
来判断
存在,
异常的
不存在
时候,
当然,
因
在
构造器
Fil
= n
thr
或
Fil
if (!f.ex
thro
}
FileInput
int b;
b = fis.r
while (b
Syst
b =
}
fis.close
ublic static
ThrowExam
try {
te.r
} catch (
Syst
} catch (
Syst
}
在这个程序中
e 类中有一个
断指定文件是
则一定会抛
的抛出时机。
在,将抛出一
抛出的必须
更不可以是
因此,如果有
(1)找到一个
(2)实例化这
(3)抛出这个
在实例化一个
器,使用这个
leNotFoundExc
new FileNotFo
row fne;
或者:
leNotFoundExc
华
xists()) {
ow new FileNo
tStream fis =
read();
!= -1) {
tem.out.print
fis.read();
e();
void main(S
m1 te = new T
readFile();
(FileNotFound
tem.out.print
(IOException
tem.out.print
中,我们使用
个用于判断文
是否存在,如
抛出 FileNotF
请读者注意
一个 FileNotF
须是 Throwab
是简单类型数
有一个现成的
个合适的异常
这个异常类。
个异常类对象
个用于抛出的
个构造器,可
ception fne
ouneException
ception fne
华清远见�—
www
otFoundExcept
= new FileInp
t((char) b);
tring[] args
ThrowExam1();
dException e)
tln("FileNotF
e1) {
tln("IOExcept
用 File 对象来
文件或目录是
如果存在,则
FoundExcepti
意程序中的斜
FoundExcept
ble 或者它的
数据。 的异常可以使
常类。
。
象。
的异常类的时
可以更加精确
n("File "+fil
高端 IT 就业
w.embedu.or
tion("File ca
putStream(f);
) {
;
) {
FoundExceptio
tion:" + e1.g
来作为 FileInp
是否存在的方
则肯定不会抛
ion 异常,通
斜体部分,它
ion。注意,
的子类的实例
使用,则我们
时候,通常使
确方描述异常
lename+ " Not
第
业培训专家�
rg
an't be found
;
on:" + e.getM
getMessage())
putStream 这
方法 exists(),
抛出 FileNotF
通过这个现成
它首先判断指
在这边使用
例,而不能是
们可以方便地
使用这些异常
常发生的情况
t Found!");
8 章 Java 异
d!");
Message());
);
这个类的构造
所以,可以
FoundExcepti
成的异常类,
指定的文件是
throw 关键
是其他的任何
自己抛出异常
类的带 Strin
:
异常处理
184
器的参数。因
使用这个方法
on,而如果不
我们可以控制
否存在,如果
字抛出对象的
类型的对象,
常:
ng 类型参数的
814
因
法
不
制
果
的
,
的
�
�
182 4
= n
thr
8.2.5
当
用者来
met
t
c
}
}
在
类型的
met
t
c
}
}
8.2.6
当
覆
示
源
imp
pub
p
}
}
源
imp
pub
p
}
}
new FileNotFo
row fne;
5 任务四:
当我们捕获异
来处理它。捕
thod() throws
ry{…}
atch(XXXExce
throw e;
在 catch()从句
的异常的实例
thod() throws
ry{…}
atch(XXXExce
throw new
6 任务五:
当子类中的方
覆盖方法时,
示例 8-8:方
源文件:Parent
port java.io.
blic class Pa
public void m
throws IO
// IO操作
源文件:Child.j
port java.io.
blic class Ch
public void m
throws Fi
// IO操作,数
华
oundException
捕获异常
异常但不知道
捕获异常和抛
s XXXExceptio
ption e) {
句中,可以向
例:
s XXXExceptio
ption e) {
w Exception("
进行方法
方法覆盖父类
可以抛出与
方法覆盖时的异
t.java
.*;
arent {
methodA()
OException {
ava
.*;
hild extends
methodA()
ileNotFoundEx
数学运算
华清远见�—
www
n("文件"+file
常和抛出异常
道如何去处理
抛出异常的方
on{
向外抛出被捕
on{
"My Exception
法覆盖时对异
类中的方法时
与被覆盖方法
异常处理。
Parent {
xception, UTF
高端 IT 就业
w.embedu.or
eName+"没有找到
常结合使用
理这些异常时
方式,并不是
捕获的异常类
n");
异常的处理
时,可以抛出
法相同的异常
FDataFormatEx
业培训专家�
rg
到!");
用
时,我们可以
是排它的,它
类型的实例,
理
出异常。
常或者被覆盖
xception{
以将捕获的异
们可以结合起
也可以向外
方法的异常的
常抛给方法调
起来使用:
抛出另外一个
的子类异常。
调
个
。
�
�
这
个子类
的异常
子类。
再
imp
pub
p
}
}
编
Chi
does n
p
1 e
这
Excep
另
异常,
8.3
8.3.1
虽
异常处
一
为空的
示
源
pub
p
}
这个案例中定
类中,覆盖了
常间的关系。
这样的覆盖
再来看一个也
port java.io.
blic class Ch
public void m
throws Ex
// IO操作,数
编译这个程序
ild1.java:4:
not throw jav
public void m
error
这就是因为覆
ption 是 IOEx
另外,如果父
也不能抛出
自定义
知识准备
虽然 JDK 中包
处理类来处理
一般而言,在
的构造器,以
示例 8-9:自
源文件:MyDiv
blic class My
ublic MyDivi
super();
华
定义了两个类
了父类中的 m
FileNotFoun
盖方法是允许
也是继承了 P
.*;
hild1 extends
methodA()
xception {
数学运算
序,将会出错
methodA() in
va.lang.Excep
methodA()
覆盖方法抛
xception 的父
父类方法没有
出除父类方法
义异常
备:自定义
包含了丰富的
理异常。通过
在实现自己定
以及一个带一
定义异常。
ideException.j
yDivideExcept
deException(
华清远见�—
www
类:Parent 和
methodA()方法
ndException
许的。 Parent 类,并
s Parent {
错:
n Child1 cann
ption
出的异常不
父类。
有声明抛出异
法中声明的异
义异常概念
的异常处理类
过继承 Except
定义的异常类
一个 String 类
java
tion extends
) {
高端 IT 就业
w.embedu.or
Child,其中
法,请注意它
和 UTFData
并且覆盖了方
not override
不是被覆盖方
常,那么子类
常(包括其子
类,但是,很
tion 或者它的
类时,会给这
类型参数的构
ArithmeticEx
第
业培训专家�
rg
中 Child 是 P
它抛出的异常
aFormatExce
方法 methodA
methodA() in
方法的异常或
类覆盖方法不
子类异常)外
很多时候,我
的子类,就可
这个异常类设
构造器,用来传
xception {
8 章 Java 异
Parent 的子类
常和父类中被
ption 是 IOE
A()的例子:
n Parent; ove
或者它的子类
不可以声明抛
外的其他“已
我们不得不借
可以实现自己
设计两个构造
传递详细的出
异常处理
184
类。在 Child 这
覆盖方法抛出
Exception 类的
rridden metho
类。相反的,
抛出“已检查
已检查”异常。
助自己定义的
己的异常类。
器:一个参数
出错信息。
834
这
出
的
hod
,
”
。
的
数
�
�
184 4
p
}
p
}
}
在
使得这
源
pub
p
}
}
这
下列命
jav
则
除以
8.3.2
示
源
pub
p
}
}
ublic MyDivi
super(msg
ublic String
return "除
在这个自定义
这个方法能够
源文件:Divide
blic class Di
ublic static
int n = 0
double q;
try {
n =
d =
if (
q =
Syst
} catch (
Syst
}
这个类中,使
命令来运行这
va DivedeExce
则将会得到一
以零引起的例外!
2 知识拓展
示例 8-10:使
源文件:SelfDe
blic class Se
ublic SelfDe
super("自
华
deException(
g);
g toString()
除以零引起的例外
义的异常类中
够返回更能反
ExceptionTest
ivideExceptio
void main(S
0, d = 0;
;
Integer.pars
Integer.pars
(d == 0)
throw new M
(double) n /
tem.out.print
(MyDivideExce
tem.out.print
使用到了我们
这个程序:
eptionTest 1
一个输出如下
展:通过 p
使用 printStac
efinedExceptio
elfDefinedExc
finedExcepti
自定义的例外类")
华清远见�—
www
String msg)
{
外!";
中,定义了两
反映这个类的
t.java
onTest {
tring args[]
seInt(args[0]
seInt(args[1]
MyDivideExcep
/ d;
tln(n + "/" +
eption e) {
tln(e);
们自己定义的
0
下:
rintStackT
ckTrace()方法
on.java
ception exten
on(){
;
高端 IT 就业
w.embedu.or
{
两个构造器,
的信息。
) {
);
);
ption();
+ d + "=" + q
的那个异常类
race()追踪
法追踪异常。
nds Exception
业培训专家�
rg
并且覆盖了
q);
类:MyDivide
踪异常源头
n{
父类中的 toS
eException。
String()方法,
如果我们通过
,
过
�
�
这
源
pub
p
}
p
}
p
}
p
}
}
在
方法,
Sel
由
的源头
8.4
这是一个自定
源文件:TestPr
blic class Te
ublic static
try {
firs
}catch(Se
e.pr
}
ublic static
secondMet
ublic static
thirdMeth
ublic static
throw new
在这个类中,
而第三个方
lfDefinedExce
at TestP
at TestP
at TestP
at TestP
由此,可以看
头在 thirdMet
提示:
虽然 printS
在最后发布将异常堆栈
本章小
华
定义的异常类
rintStackTrace
estPrintStack
void main(S
stMethod();
elfDefinedExc
rintStackTrac
void firstM
thod();
void second
hod();
void thirdM
w SelfDefined
定义了 3 个
方法只是抛出
eption: 自定义
PrintStackTra
PrintStackTra
PrintStackTra
PrintStackTra
看出执行 mai
thod 中。
StackTrace()方法布的程序中,应栈打印出来。
小结
华清远见�—
www
类,并没有实
e.java
kTrace{
tring args[]
ception e){
ce();
Method() thro
dMethod() thr
Method() thro
dException();
个方法,第一
出了一个异常
义的例外类
ace.thirdMeth
ace.secondMet
ace.firstMeth
ace.main(Test
n()方法时出
法可以很方便地应该避免使用它
高端 IT 就业
w.embedu.or
实际的用途,
) {
ows SelfDefin
rows SelfDefi
ows SelfDefin
;
一个方法调用
常,当运行这
hod(TestPrint
thod(TestPrin
hod(TestPrint
tPrintStackTr
现了一个 Se
地用于追踪异常它,而应该对捕
第
业培训专家�
rg
仅用于演示
nedException{
inedException
nedException{
用第二个方法
这个程序时,
tStackTrace.j
ntStackTrace.
tStackTrace.j
race.java:12)
elfDefinedEx
常的发生情况捕获的异常进行
8 章 Java 异
printStackTr
n{
法,第二个方
将会得到如下
java:32)
.java:27)
java:22)
)
xception 异常
,可以使用它来行适当的处理
异常处理
184
race()方法。
法调用第三个
下的输出:
常,而这个异常
来调试程序,但,而不是简单地
854
个
常
但地
�
�
186 4
通
的异常
常,以
课后练
一
1
A
C
2
A
B
C
D
3
A
B
C
D
4
A
C
5
A
B
C
D
二
1
2
3
三
1
try-cat
通过本章的学
常;使用 try
以及如何在覆
练习题
一、选择题
.当方法遇
A.捕获异常
C.声明异常
2.下列说法
A.程序中必
B.程序中必
C.程序中非
D.所有的异
.对于 catch
A.父类在先
B.子类在先
C.有继承关
D.一个 try 后
4.自定义的
A.Error 类
C.Throwabl
5.下列说法
A.子类在重
B.子类在重
C.子类在重
D.子类在重
二、简答题
.简述 Java
2.简述异常
.简述方法覆
三、编程题
.定义一个
tch 中以捕获
华
学习,读者应
、catch 和 fi
覆盖方法的时
到异常又不知
常
常
正确的是(
必须要处理的
必须要处理的
非运行时异常
异常类 终都
h 子句的排列
先,子类在后
先,父类在后
关系的异常不
后面只能配一
异常类应该从
le
正确的是(
重写父类方法
重写父类方法
重写父类方法
重写父类方法
的异常处理
处理中 throw
覆盖时要注意
个对象引用并
获异常, 后
华清远见�—
www
应该掌握异常
finally 来捕获
时候处理父类
知如何处理时
B.抛
D.嵌
)。
是非运行时异
是运行时异常
和运行时异常
都继承自 Thro
列,下列()
能在同一个
一个 catch
从下列(
B.L
D.E
)。
法时不能抛出异
时只能抛出与
时对异常没有
法时必须捕获父
理机制。
w 和 throws 的
意的异常问题
并初始化为 n
后 finally 子句
高端 IT 就业
w.embedu.or
常的基本概念
获异常;掌握
类中的异常,
时,下列(
抛出异常
嵌套异常
异常
常
常都必须处理
owable 类
是正确的。
try 程序段
)类继承。
LinkageError
Exception 及
异常。
与被覆盖方法
有限制规定
父类被覆盖方
的区别。
题。
null,尝试用
句中输出“异
业培训专家�
rg
念,并能描述
握如何将异常
等等。
)做法是
理
内
r
及其子类
法相同的异常
方法抛出的异
用此引用调用
常例子”。
述异常的种类
常抛出,并开
正确的。
常或者其子异
异常
用方法。把这
,辨认常出现
发自定义的异
异常
这个调用放在
现
异
在
�
�
2
字符串
3
2.写一个自定
串。
.编写一个类
华
定义异常类,
类,在类中抛
华清远见�—
www
,并为其编写
抛出作业 2 中
高端 IT 就业
w.embedu.or
写接收字符串
中的自定义异
第
业培训专家�
rg
串参数的构造
异常,并作捕
8 章 Java 异
造器,在构造
捕获处理。
异常处理
184
器中输出这个
874
个