SUN_JAVA 培训专用教材C07

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SUN_JAVA 培训专用教材C07第七章异常
本模块讲述建立在Java编程语言中的错误处理装置。

第一节有关咨询题
讨论—下述咨询题与本模块中的材料有关:
在大部分编程语言中,如何解决运行时错误?
第二节目的
本模块学习终止后,能够:
定义专门
使用try,catch和finally语句
描述专门分类
开发程序来处理自己的专门
第三节异常
异常
7.3.1 介绍
什么是专门?在Java编程语言中,专门类定义程序中可能遇到的轻微的错误条件。

能够写代码来处理专门并连续程序执行,而不是让程序中断。

在程序执行中,任何中断正常程序流程的专门条件确实是错误或专门。

例如,发生下列情形时,会显现专门:
想打开的文件不存在
网络连接中断
受控操作数超出预定范畴
专门感爱好地正在装载的类文件丢失
在Java编程语言中,错误类定义被认为是不能复原的严峻错误条件。

在大多数情形下,当遇到如此的错误时,建议让程序中断。

Java编程语言实现C++专门来关心建立弹性代码。

在程序中发生错误时,发觉错误的方法能抛出一个专门到其调用程序,发出差不多发生咨询题的信号。

然后,调用方法捕捉抛出的专门,在可能时,再复原回来。

那个方案给程序员一个写处理程序的选择,来处理专门。

通过扫瞄API,能够决定方法抛出的是什么样的专门。

7.3.2 实例
考虑一下HelloWorld.java程序版本的简单扩展,它通过信息来循环:
public class HelloWorld {
public static void main (String args[]) {
int i = 0;
String greetings [] = {
"Hello world!",
"No, I mean it!",
"HELLO WORLD!!"
};
while (i < 4) {
System.out.println (greetings[i]);
i++;
}
}
}
正常情形下,当专门被抛出时,在其循环被执行四次之后,程序终止,并带有错误信息,就象前面所示的程序那样。

c:\student\> java HelloWorld
Hello world!
No, I mean it!
HELLO WORLD!!
ng.ArrayIndexOutOfBoundsException: 3
at HelloWorld.main(HelloWorld.java:12)
专门处理承诺程序捕捉专门,处理它们,然后连续程序执行。

它是分层把关,因此,错误情形可不能介入到程序的正常流程中。

专门情形发生时,在与正常执行的代码分离的代码块中被处理。

这就产生了更易识不和治理的代码。

第四节专门处理
Java编程语言提供了一个来考虑哪个专门被抛出以及如何来复原它的机制。

7.4.1 try和catch语句
要处理专门的专门,将能够抛出专门的代码放入try块中,然后创建相应的catch块的列表,每个能够被抛出专门都有一个。

如果生成的专门与catch中提到的相匹配,那么catch条件的块语句就被执行。

在try 块之后,可能有许多catch块,每一个都处理不同的专门。

1. try {
2. // code that might throw a particular exception
3. } catch (MyExceptionType e) {
4. // code to execute if a MyExceptionType exception is thrown
5. } catch (Exception e) {
6. // code to execute if a general Exception exception is thrown
7. }
7.4.2 调用栈机制
如果方法中的一个语句抛出一个没有在相应的try/catch块中处理的专门,那么那个专门就被抛出到调用方法中。

如果专门也没有在调用方法中被处理,它就被抛出到该方法的调用程序。

那个过程要一直连续到专门被处理。

如果专门到这时还没被处理,它便回到main(),而且,即使ma in()不处理它,那么,该专门就专门地中断程序。

考虑如此一种情形,在该情形中main()方法调用另一个方法(例如,first()),然后它调用另一个(例如,second())。

如果在second()中发生专门,那么必须做一个检查来看看该专门是否有一个catch;如果没有,那么对调用栈(first())中的下一个方法进行检查,然后检查下一个(main())。

如果那个专门在该调用栈上没有被最后一个方法处理,那么就会发生一个运行时错误,程序终止执行。

7.4.3 finally语句
finally语句定义一个总是执行的代码块,而不考虑专门是否被捕捉。

下述样板代码来自Frank Yellin弗兰克叶林的白皮书《Java中的低级安全》:
try {
startFaucet();
waterLawn();
}
finally {
stopFaucet();
}
在前面的例子中,即使专门在打开开关或给草地浇水时发生,开关也能被关掉。

try 后面的括号中的代码被称做爱护码。

如果终止程序的System.exit()方法在爱护码内被执行,那么,这是finally语句不被执行的唯独情形。

这就暗示,操纵流程能偏离正常执行顺序,例如,如果一个return语句被嵌入try块内的代码中,那么,finally块中的代码应在return前执行。

7.4.4 重访前例
下面的例子是第169页main()方法的重写。

本程序往常的版本中产生的专门被捕捉,数组索引重新设定,使下述程序连续运行。

public static void main (String args[]) {
int i = 0;
String greetings [] = {
"Hello world!",
"No, I mean it!",
"HELLO WORLD!!"
};
while (i < 4) {
try {
System.out.println (greetings[i]);
} catch (ArrayIndexOutOfBoundsException e){
System.out.println( "Re-setting Index Value");
i = -1;
} finally {
System.out.println("This is always printed");
}
i++;
} // end while()
} // end main()
当循环被执行时,下述在屏幕上显现的信息将改变。

Hello world!
This is always printed
No, I mean it!
This is always printed
HELLO WORLD!!
This is always printed
Re-setting Index Value
This is always printed
第五节专门分类
在Java编程语言中,专门有三种分类。

ng.Throwable类充当所有对象的父类,能够使用专门处理机制将这些对象抛出并捕捉。

在T hrowable类中定义方法来检索与专门有关的错误信息,并打印显示专门发生的栈跟踪信息。

它有Error和Exception两个差不多子类,如下图所示:
Throwable类不能使用,而使用子类专门中的一个来描述任何专门专门。

每个专门的目的描述如下:
Error表示复原不是不可能但专门困难的情形下的一种严峻咨询题。

例如讲内存溢出。

不可能希望程序能处理如此的情形。

RuntimeException表示一种设计或实现咨询题。

也确实是讲,它表示如果程序运行正常,从可不能发生的情形。

例如,如果数组索引扩展不超出数组界限,那么,ArrayIndexOutOfBoundsException专门从可不能抛出。

例如,这也适用于取消引用一个空值对象变量。

因为一个正确设计和实现的程序从不显现这种专门,通常对它不做处理。

这会导致一个运行时信息,应确保能采取措施更正咨询题,而不是将它藏到谁也不注意的地点。

其它专门表示一种运行时的困难,它通常由环境成效引起,能够进行处理。

例子包括文件未找到或无效URL专门(用户打了一个错误的URL),
如果用户误打了什么东西,两者都容易显现。

这两者都可能因为用户错误而显现,这就鼓舞程序员去处理它们。

第六节共同专门
Java编程语言提供几种预定义的专门。

下面是可能遇到的更具共同性的专门中的几种:
ArithmeticException—整数被0除,运算得出的结果。

int I =12 / 0;
NullPointerException—当对象没被实例化时,访咨询对象的属性或方法的尝试:
Date d= null;
System.out.println(d.toString());
NegativeArraySizeException—创建带负维数大小的数组的尝试。

ArrayIndexoutofBoundsException—访咨询超过数组大小范畴的一个元素的尝试。

SecurityException—典型地被抛出到扫瞄器中,SecurityManager类将抛出applets的一个专门,该专门妄图做下述工作(除非明显地得到承诺):访咨询一个本地文件
打开主机的一个socket,那个主机与服务于applet的主机不是同一个。

在运行时环境中执行另一个程序
第七节处理或声明规则
为了写出健壮的代码,Java编程语言要求,当一个方法在栈(即,它差不多被调用)上发生Exception(它与Error或RuntimeException不同)时,那么,该方法必须决定如果显现咨询题该采取什么措施。

程序员能够做满足该要求的两件事:
第一,通过将Try{}catch(){}块纳入其代码中,在那个地点捕捉给被命名为属于某个超类的专门,并调用方法处理它。

即使catch块是空的,这也确实是处理情形。

第二,让被调用的方法表示它将不处理专门,而且该专门将被抛回到它所遇到的调用方法中。

它是按如下所示通过用throws子句标记的该调用方法的声明来实现的:
public void troublesome() throws IOException
关键字throws之后是所有专门的列表,方法能够抛回到它的调用程序中。

尽管那个地点只显示了一个专门,如果有成倍的可能的专门能够通过该方法被抛出,那么,能够使用逗号分开的列表。

是选择处理依旧选择声明一个专门取决因此否给你自己或你的调用程序一个更合适的候选的方法来处理专门。

第八节创建自己的专门
7.8.1 介绍
用户定义专门是通过扩展Exception类来创建的。

这种专门类能够包含一个“一般”类所包含的任何东西。

下面确实是一个用户定义专门类例子,它包含一个构造函数、几个变量以及方法:
public class ServerTimedOutException extends Exception {
private String reason;
private int port;
public ServerTimedOutException (String reason,int port){
this.reason = reason;
this.port = port;
}
public String getReason() {
return reason;
}
public int getPort() {
return port;
}
}
使用语句来抛出差不多创建的专门:
throw new ServerTimedOutException
("Could not connect", 80);
7.8.2 实例
考虑一个客户服务器程序。

在客户代码中,要与服务器连接,并期望服务器在5秒钟内响应。

如果服务器没有响应,那么,代码就如下所述抛出一个专门(如一个用户定义的ServerTimedOutException)。

1. public void connectMe(String serverName) throws
ServerTimedOutException {
int success;
int portToConnect = 80;
success = open(serverName, portToConnect);
if (success == -1) {
throw new ServerTimedOutException(
"Could not connect", 80);
}
}
要捕捉专门,使用try语句:
public void findServer() {
. . .
try {
connectMe(defaultServer);
} catch(ServerTimedOutException e) {
System.out.println("Server timed out, trying alternate");
try {
connectMe(alternateServer);
} catch (ServerTimedOutException e1) {
System.out.println("No server currently available");
}
}
也可能部分地处理一个专门然后也将它抛出。

如:
try {
.....
.....
} catch (ServerTimedOutException e) {
System.out.println("Error caught ");
throw e;
}
练习:处理并创建专门
练习目的—通过编写能够创建并处理专门的Java软件程序,能够获得专门机制的体会。

一、预备
为了成功地完成该实验,必须明白得处理运行时错误的专门的概念。

二、任务
一级实验:处理一个专门
1. 使用第169页上的样板专门程序在数组索引超出数组大小时创建一个专门。

(或修改自己的程序以便创建一个专门。


2. 使用try和catch语句从专门进行复原。

二级实验:创建自己的专门
使用模块5中创建的bank包并附加下述专门:
AccountOverdrawnException—当有了那个要取出比帐户上更多的钞票的尝试时。

InvalidDepositException—当无效钞票数(小于0)存入时。

三、练习总结
讨论—花几分钟时刻讨论实验练习中所取得的体会、咨询题或发觉。

体会讲明总结应用
四、检查进步情形
在连续下一个模块前,检查一下,确信能够:
定义专门
使用try,catch和finally语句
描述专门分类
确认共同专门
开发程序来处理自己的专门
五、摸索
Java应用环境有什么特点,使它支持用户界面的开发?。

相关文档
最新文档