第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8....

17
来捕如何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件问题, 运行外别在的输入等 象进行操ceptionErro rorLinkageE 如何通过 tr 法覆盖的时 的源头的错,也不要 不要指望你 的地方输入 象可能会碰 ,所谓“吗?对于某 “否”,基如,内存他法。而对引起的一般以及网络不 or 类和 Exc ErrorVirtua ry-catch-final 处理异常 法。 指望用户能需要的某个字而不是到的错误、备无患”,些编程语言上,Java 源不足等。 Exception问题,例定引起的ception 类都alMachineErr lly ror

Transcript of 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8....

Page 1: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

来捕获

如何自

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

Page 2: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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、有关

由于程序编写

因引起的。引

存在。

算,你或许会

美好。也许,

如用户输入如

Page 3: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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

Page 4: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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 也

Page 5: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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

理,

Page 6: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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()方法来

行堆栈的内容

的意义在于,

些资源(比如,

一个异常,方

时候,本来定

此时,就可

,它都能被执

获两个异常:

系统都将会执

的详细信息。

后执行这个程

因此程序已经

容。

Page 7: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

常,则

异常之

比如

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

Page 8: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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 从句存在,

句,

Page 9: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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

Page 10: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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

Page 11: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

}

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

Page 12: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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{

以将捕获的异

们可以结合起

也可以向外

方法的异常的

常抛给方法调

起来使用:

抛出另外一个

的子类异常。

Page 13: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

个子类

的异常

子类。

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

Page 14: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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()方法,

如果我们通过

Page 15: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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

但地

Page 16: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

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

及其子类

法相同的异常

方法抛出的异

用此引用调用

常例子”。

述异常的种类

常抛出,并开

正确的。

常或者其子异

异常

用方法。把这

,辨认常出现

发自定义的异

异常

这个调用放在

Page 17: 第8 章 Java 异 常处理download.hqyj.com/download/ebooks/Farsight-AndroidJava... · 2017. 8. 7. · jav 这 Exc ThreadDeath 这种情况是 tion 的子类就 的异常Ru 的不周全的

2

字符串

3

2.写一个自定

串。

.编写一个类

定义异常类,

类,在类中抛

华清远见�—

www

,并为其编写

抛出作业 2 中

高端 IT 就业

w.embedu.or

写接收字符串

中的自定义异

业培训专家�

rg

串参数的构造

异常,并作捕

8 章 Java 异

造器,在构造

捕获处理。

异常处理

184

器中输出这个

874