【运行结果】
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 第7章(异常部分) 一、选择题
1.关于异常的含义,下列描述中最正确的一个是( D )。
A.程序编译错误B.程序语法错误C.程序自定义的异常事件D.程序编译或运行时发生的异常事件 【解析】异常就是程序编译或运行时发生的异常事件。
3.对应try和catch子句的排列方式,下列哪一项是正确的?( A )
A.子类异常在前,父类异常在后 B.父类异常在前,子类异常在后C.只能有子类异常 D.父类和子类不能同时出现在try语句块中
【解析】对应try和catch子句的排列方式,要求子类异常(范围小的异常)在前,父类异常(范围大的异常)在后。 4.运行下面程序时,会产生什么异常?( A )
public class X7_1_4 {
public static void main(String[] args) { int x = 0; int y = 5/x; int[] z = {1,2,3,4}; int p = z[4]; } }
A.ArithmeticException B.NumberFormatException C.ArrayIndexOutOfBoundsException
D.IOException
【解析】当程序执行到“int y = 5/x”语句时,发生异常,程序中止执行,因此发生ArithmeticException异常。 5.运行下面程序时,会产生什么异常?( C )
public class X7_1_5 {
public static void main(String[] args) { int[] z = {1,2,3,4}; int p = z[4]; int x = 0; int y = 5/x; } }
A.ArithmeticException B.NumberFormatExceptionC.ArrayIndexOutOfBoundsException D.IOException
【解析】当程序执行到“int p = z[4]”语句时,发生异常,程序中止执行,因此发生ArrayIndexOutOfBoundsException异常。 6.下列程序执行的结果是( B )。
public class X7_1_6 {
public static void main(String[] args) { try{ return; } finally{ System.out.println(\ } }
} A.程序正常运行,但不输出任何结果 B.程序正常运行,并输出Finally C.编译通过,但运行时出现异常D.因为没有catch子句,因此不能通过编译
【解析】在执行try-catch-finally语句块时,最后必须执行finally语句块中的内容,而本程序没有异常发生,因此程序正常运行,并输出Finally。
8.下列描述了Java语言通过面相对象的方法进行异常处理的好处,请选出不在这些好处范围之内的一项( C ) A.把各种不同的异常事件进行分类,体现了良好的继承性B.把错误处理代码从常规代码中分离出来
C.可以利用异常处理机制代替传统的控制流程 D.这种机制对具有动态运行特性的复杂程序提供了强有力的支持 26
【解析】异常处理机制不能代替传统的流程控制。 二、填空题
3.所有的Java异常类都是系统类库中的 Exception 类的子类。
5.Java语言为我们提供了 try?catch 语句和try?catch?finally 语句捕捉并处理异常。 6.一个try块后面可能会跟着若干个 catch 块,每个 catch 块都有一个异常类名作为参数。
7.如果try语句块产生的异常对象被第一个catch块所接收,则程序的流程将 转向第一个catch块 ,catch语句块执行完毕后就 退出当前方法 ,try块中尚未执行的语句和其他的catch块将被 忽略 ;如果try语句块产生的异常对象与第一个catch块不匹配,系统将自动转到 第二个catch块 进行匹配。
8.由于异常对象与catch块的匹配是按照catch块的 先后 顺序进行的,所以在处理多异常时应注意认真设计各catch块的排列顺序。 第6章 一、选择题
2.Java语言提供处理不同类型流的类所在的包是( D )。
A.java.sql
B.java.util
C.java.net
D.java.io
【解析】java.io 包是Java语言提供处理不同类型流的类所在的包。
4.下列程序从标准输入设备读入一个字符,然后再输出到显示器,选择正确的一项填入―//x‖处,完成要求的功能( B )。
import java.io.*;
public class X8_1_4 { public static void main(String[] args) { char ch; try{ //x System.out.println(ch); } catch(IOException e){ e.printStackTrace(); } } }
A.ch = System.in.read(); B.ch = (char)System.in.read(); C.ch = (char)System.in.readln();
D.ch = (int)System.in.read();
【解析】System.in.read()方法返回的是字符对应的Unicode码,即返回的类型是int型,而ch是char类型,因此必须把方法的返回值强制转换为char类型才能把它赋值给ch变量。另外,System.in对象中没有readln()方法。
5.下列程序实现了在当前包dir815下新建一个目录subDir815,选择正确的一项填入程序的横线处,使程序符合要求( D )。
package dir815; import java.io.*;
public class X8_1_5 { public static void main(String[] args){ char ch; try{ File path = ; if(path.mkdir()) System.out.println(\ } catch(Exception e){ e.printStackTrace(); } } }
A.new File(\ B.new File(\ C.new File(\
D.new File(\
【解析】在程序中,目录之间的连接符是“\\\\”或“/”,因此首先排除B和C;而默认情况下,创建相对目录是在当前目录下进行,而dir815也在当前目录下,因此要在dir815下创建新的目录,就必须使用D的形式。 27
6.下列流中哪一个使用了缓冲区技术( A )?
A.BufferedOutputStream B.FileInputStream C.DataOutputStream 【解析】只有BufferedOutputStream使用了缓冲区技术。
7.能读入字节数据进行Java基本数据类型判断过虑的类是( C )。
A.BufferedInputStream
B.FileInputStream C.DataInputStream D.FileReader
【解析】DataInputStream类在读入字节数据时,进行Java基本数据类型判断过虑。 8.使用哪一个类可以实现在文件的任一个位置读写一个记录( B )?
A.BufferedInputStream
B.RandomAccessFile C.FileWriter D.FileReader
【解析】只有RandomAccessFile才能实现在文件的任一个位置读写一个记录。
9.在通常情况下,下列哪个类的对象可以作为BufferedReader类构造方法的参数( C )?
A.PrintStream B.FileInputStream C.InputStreamReader D.FileReader 【解析】InputStreamReader类的对象可以作为BufferedReader类构造方法的参数。
10.若文件是RandomAccessFile的实例f,并且其基本文件长度大于0,则下面的语句实现的功能是( B )。
f.seek(f.length()-1);
A.将文件指针指向文件的第一个字符后面
B.将文件指针指向文件的最后一个字符前面
D.FileReader
C.将文件指针指向文件的最后一个字符后面 D.会导致seek()方法抛出一个IOException异常
【解析】通过调用f对象的length()方法,可以将文件指针指向文件的末尾,因此f.length()-1即指向文件的最后一个字符前面。 11.下列关于流类和File类的说法中错误的一项是( B )。
A.File类可以重命名文件 B.File类可以修改文件内容C.流类可以修改文件内容 【解析】只有流类可以修改文件内容,而File类则不能。
12.若要删除一个文件,应该使用下列哪个类的实例( B )?
A.RandomAccessFile
B.File C.FileOutputStream
D.FileReader
【解析】要删除文件以及查看文件属性等,应使用File类对象来实现。 13.下列哪一个是Java系统的标准输入流对象( B )?
A.System.out B.System.in 是System类的退出方法。 二、填空题
2.凡是从外部设备流向中央处理器的数据流,称之为 输入 流;反之,称之为 输出 流。 4.所有的字节输入流都从 InputStream 类继承,所有的字节输出流都从 OutputSteam 类继承。
5.与用于读写字节流的InputStream类和OutputStream类相对应,Java还提供了用于读写Unicode字符的字符流 Reader 类和 Writer 类。 6.对一般的计算机系统,标准输入通常是 键盘 ,标准输出通常是 显示器 。
7.Java系统事先定义好两个流对象,分别与系统的标准输入和标准输出相联系,它们是 System.in 和 System.out 。 8.System类的所有属性和方法都是 Static类型 的,即调用时需要以类名System为前缀。
9.Java的标准输入System.in是 InputStream 类的对象,当程序中需要从键盘读入数据的时候,只需调用System.in的 read 方法即可。 14.在计算机系统中,需要长期保留的数据是以 文件 的形式存放在磁盘、磁带等外存储设备中的。 15. 目录 是管理文件的特殊机制,同类文件保存在同一 目录 下可以简化文件的管理,提高工作效率。
16.Java语言的java.io包中的 File 类是专门用来管理磁盘文件和目录的。调用 File 类的方法则可以完成对文件或目录的常用管理操作,如创建文件或目录、删除文件或目录、查看文件的有关信息等。
17.File类也虽然在java.io包中,但它不是InputStream或者OutputStream的子类,因为它不负责 数据的输入输出 ,而专门用来管理 文
件和目录 。
18.如果希望从磁盘文件读取数据,或者将数据写入文件,还需要使用文件输入输出流类
FileInputStream 和 FileOutputStream 。
19.Java系统提供的FileInputStream类是用于读取文件中的 字节 数据的 字节 文件输入流类;FileOutputStream类是用于向文件写入
字节 数据的 字节 文件输出流。 第7章(线程部分) 一、选择题 28
C.System.exit
D.System.err
【解析】System.in是Java系统的标准输入流对象,而System.out和System.err则是Java系统的标准输出流和标准错误对象,System.exit则
D.流类不可以新建目录
1.下列说法中,正确的一项是( A )。
A.单处理机的计算机上,2个线程实际上不能并发执行 B.单处理机的计算机上,2个线程实际上能够并发执行 C.一个线程可以包含多个进程 D.一个进程只能包含一个线程
【解析】单处理机的计算机上通过一个极短的固定时间段或者在线程等待时,切换到另一个线程,这种调度过程时间极短,看上去像是并发执行。
2.下列说法中,错误的一项是( A )。
A.线程就是程序 B.线程是一个程序的单个执行流 C.多线程是指一个程序的多个执行流 D.多线程用于实现并发 【解析】线程是一个程序的单个执行流,而不是程序本身。而多线程作为实现并发的一个重要手段,是一个程序的多个执行流。 3.下列关于Thread类的线程控制方法的说法中错误的一项是( C )。
A.线程可以通过调用sleep()方法使比当前线程优先级低的线程运行B.线程可以通过调用yield()方法使和当前线程优先级一样的线程运行C.线程的sleep()方法调用结束后,该线程进入运行状态D.若没有相同优先级的线程处于可运行状态,线程调用yield()方法时,当前线程将继续执行
【解析】线程的sleep()方法调用结束后,该线程进入就绪状态,而不是运行状态。 4.方法resume()负责恢复下列哪一个线程的执行( D )?
A.通过调用stop()方法而停止的线程B.通过调用sleep()方法而停止的线程 C.通过调用wait()方法而停止的线程 D.通过调用suspend()方法而停止的线程 【解析】通过调用suspend()方法而停止的线程需要调用resume()恢复。
5.下面的哪一个关键字通常用来对对象加锁,从而使得对对象的访问是排他的( C )?
A.serialize
B.transient
C.synchronized
D.static
【解析】synchronized用来对对象加锁,从而使得对对象的访问是排他的。 6.下列说法中,错误的一项是( A )。
A.线程一旦创建,则立即自动执行 B.线程创建后需要调用start()方法,将线程置于可运行状态 C.调用线程的start()方法后,线程也不一定立即执行 D.线程处于可运行状态,意味着它可以被调度 【解析】线程创建后需要调用start()方法,将线程置于可运行状态。 7.下列说法中,错误的一项是( A )。
A.Thread类中没有定义run()方法
B.可以通过继承Thread类来创建线程 D.可以通过实现Runnable接口创建线程
C.Runnable接口中定义了run()方法 8.Thread类定义在下列哪个包中( B )?
A.java.io
B.java.lang
C.java.util
D.java.awt
【解析】Thread类定义在java.lang包中,因此使用时可以不用显式加载。 9.Thread类的常量NORM_PRIORITY代表的优先级是( C )。
A.最低优先级
B.最高优先级
C.普通优先级
D.不是优先级
【解析】NORM_PRIORITY代表的优先级是普通优先级。 10.下列关于线程优先级的说法中,错误的一项是( D )。
A.MIN_PRIORITY代表最低优先级 C.NORM_PRIORITY代表普通优先级 【解析】代表优先级的常数值越大优先级越高 二、填空题
1.多线程是指程序中同时存在着 多 个执行体,它们按几条不同的执行路线共同工作,独立完成各自的功能而互不干扰。 2.每个Java程序都有一个缺省的主线程,对于Application类型的程序来说,主线程是方法 main() 执行的线程。
3.Java语言使用 Thread 类及其子类的对象来表示线程,新建的线程在它的一个完整的生命周期中通常要经历 新生 、 就绪 、 运
行 、 阻塞 和 死亡 等五种状态。
4.在Java中,创建线程的方法有两种:一种方法是通过创建 Thread 类的子类来实现,另一种方法是通过实现 Runnable 接口的类
来实现。
5.用户可以通过调用Thread类的方法 setPriority() 来修改系统自动设定的线程优先级,使之符合程序的特定需要。 6. start() 方法将启动线程对象,使之从新建状态转入就绪状态并进入就绪队列排队。 29
B.MAX_PRIORITY代表最高优先级
D.代表优先级的常数值越大优先级越低
【解析】Thread类和Runnable接口中都定义了run()方法,而start()方法只有Thread类中进行了定义,而Runnable接口中没有定义。
7.Thread类和Runnable接口中共有的方法是 run() ,只有Thread类中有而Runnable接口中没有的方法是 start() ,因此通过实现Runnable接口创建的线程类要想启动线程,必须在程序中创建 Thread 类的对象。 8.在Java中,实现同步操作的方法是在共享内存变量的方法前加 synchronized 修饰符。
9.线程的优先级是一个在 1 到 10 之间的正整数,数值越大,优先级越 高 ,未设定优先级的线程其优先级取缺省值 5 。 10.Thread类中代表最高优先级的常量是 MAX_PRIORITY ,表示最低优先级的常量是 MIN_PRIORITY 。 三、编程题
1.编写一个有两个线程的程序,第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素
数的个数,最后输出结果。
【编程分析】本程序主要考察如何实现多线程编程。
第一步:创建线程类CalPrime,在该类中实现素数个数的计算。 第二步:在主类的main()方法中创建线程类对象并启动线程。 【参考程序】
import java.io.*;
public class X9_3_1 {
public static void main(String[] args)throws IOException{ }
class CalPrime extends Thread{ } 【运行结果】
2~100000之间的素数个数为:9592 100001~200000之间的素数个数为:8392 第8章 一、选择题 30
int from, to, count=0;
public CalPrime(int from, int to){ // 构造方法 }
public void run(){ }
}
System.out.println(from + \之间的素数个数为:\
// 该方法主要计算从from到to之间素数的个数
for(int i=from; i int m = (int)Math.sqrt(i); boolean isPrime = true; for(int j=2; j<=m; j++){ } if(isPrime) count++; if(i%j==0){ } isPrime = false; break; this.from = from; this.to = to; } CalPrime thr1 = new CalPrime(2,100000); CalPrime thr2 = new CalPrime(10000,200000); thr1.start(); thr2.start();