问题
问答题
[说明]
类Queue表示队列,类中的方法如表4-12所示。
表4-12 类Queue中方法说明表
方法 | 说明 |
IsEmpty() | 判断队列是否为空,如果队列不为空,返回true;否则,返回false |
Enqueue(object NewNode) | 入队操作 |
Dequeue() | 出队操作。如果队列为空,则抛出异常 |
[Java代码]
public class testmain { //主类
public static viod main (string args[]) {
Queue q= new Queue;
q.enqueue("first!");
q.enqueue("second!");
q.enqueue("third!");
(1) {
while(true)
system.out.println(q.dequeue());
}
catch( (2) ) { }
}
public class Queue {//队列
node m_firstnode;
public Queue(){m_firstnode=null;}
public boolean isempty() {
if (m_firstnode= =null)
return true;
else
return false;
}
public viod enqueue(object newnode) { //入队操作
node next = m_firstnode;
if (next = = null) m_firstnode=new node(newnode);
else {
while(next.getnext() !=null)
next=next.getnext();
next.setnext(new node(newnode));
}
}
public object dequeue() (3) { //出队操作
object node;
if (is empty())
(4)
else {
node =m_firstnode.getobject();
m_firstnode=m_firstnode.getnext();
return node;
}
}
}
public class node{ //队列中的元素
object m_data;
node m_next;
public node(object data) {m_data=data; m_next=null;}
public node(object data,node next) {m_data=data; m_next=next;}
public void setobject(object data) {m_data=data; }
public object getobject(object data) {return m_data; }
public void setnext(node next){m_next=next; }
public node getnext() {return m_next; }
}
public class emptyqueueexception extends (5) { //异常处理类
public emptyqueueexception() {
system. out. println ( "队列已空!" );
}
}
答案
参考答案:
解析:这是一道要求读者掌握Java异常处理机制的程序分析题。本题的解答思路如下。
异常是指计算机程序执行期间中断的正常流程的事件。例外是在程序运行过程中发生的异常事件,比如除0溢出、数组越界、文件找不到等,这些事件的发生将阻止程序的正常运行。
当一个方法中发生错误时,该方法创建一个对象(该对象称之为异常对象)并将它交给运行时系统。异常对象包含了关于错误的信息,即包括错误的类型和错误发生时程序的状态。
“抛出一个异常”是指创建异常对象并将它交给运行时系统。Java的异常处理是通过try、catch、throw、 throws和finally 5个关键字来实现的。这几个关键字的解释如表4-15所示。
表4-15 Java异常处理关键字说明表
语句 | 英文解释 | 说明 |
Try | Opening exception-handling Captures the exception | 用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行 |
Catch | Captures the exception | 语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调 用对象的方法 |
Throw | Transfers control of the method to the exception handler | 总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在饮食它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块 |
Throws | Lists the exceptions a method could throw | 总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java编译器会要求声明在一个成员函数中抛出的类型。如果类型是Error或RuntimeException,或它们的子类,这个规则将不起作用,因为这在程序的正常部分中是不期待出现的。如果想明确地抛出一个RuntimeException,乙必须用throws语句来声明它的类型 |
Finally | Runs its code before terminating the program | 通过finally语句可以指定一块代码,无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等 |
表4-16 Java捕获或指定可抛出的所有被检查异常说明表
关键字 | 说明 |
捕获 | 方法可以通过为某类型的异常提供异常处理器来捕获异常 |
指定 | 方法通过在它的声明块中throws子句(throws异常类型)指定它可以抛出异常 |
被检查的异常 | 存在两种异常:运行时异常和非运行 时异常。运行时异常在Java运行时系统内发生,如算术异常、指针异常等。方法不必捕获或指定运行时异常。非运行时在Java运行时系统外的代码中发生的异常。编译器确保非运行时异常被捕获或指定,因此它们也被称为“被检查的异常” |
方法可以抛出的异常 | 包括:方法用throw语句直接抛出的任何异常;通过调用另一个方法间接抛出的任何异常 |
try {
可能抛出异常的语句
}
catch(异常类型 异常引用) {
处理异常的语句
}
catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。其中,类型匹配是指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。也可以用一个catch语句处理多个例外类型,此时它的例外类型参数应该是这几个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。
在选择要抛出的异常的类型时,可以使用其他人编写的异常类,也可以编写自己的异常类。本试题中采用自定义的类作为异常的类型。
仔细阅读试题中给出的Java源代码可知,主类TestMain包含了异常处理机制,用于检测在出队时“队列为空”的错误。因此(1)空缺处所填写的内容是“try”。
由catch语句的语法可知,(2)空缺处所填写的内容是对相应异常类型的引用。结合试题中给出的关键信息“类EmptyQueueException给出了队列操作中的异常处理操作”,即类EmptyQueueException是进行异常处理的类,因此(2)空缺处所填写的内容是“EmptyQueueExceptione”,或者“Exceptione”,其中,e是对象名,可用任意合法标识符替换。
由于异常都是从超类Exception派生而来的,因此(5)空缺处所填写的内容是“Exception”。
仔细阅读主类TestMain程序段可以看到,在try块的内部并没有给出显示的抛出异常语句,即没有出现throw语句。结合(4)空缺处所在行的注释—“队列为空,抛出异常”可以推断,在类Queue的方法dequeue中必定要抛出异常。因此(3)空缺处应指定方法dequeue可以抛出异常,即所填写的内容是“throws EmptyQueueException”。
(4)空缺处可以使用throw语句抛出异常,而使用throw语句时需要一个参数,即一个可抛出的对象,因此(4)空缺处所填写的内容是“throw(new EmptyQueueException())”。