JAVA面向对象程序设计实验指导书
2.异常类型不匹配的程序
(1)编写一个catch 语句中声明的异常类型不匹配的程序
提示:该程序表明,如果试图捕获一个不同类型的异常,将会发生意想不到的情况。
3.包含多个catch 子句的异常处理程序
(1) 程序功能:在try 子句中设计两个可能出现的异常,当a为0 时会发生异常。另外一个是肯定的异常,因为数组c的长度为1,定义c[42]是为法的。通过两个catch 子句分别来捕获异常。
4.throw 语句的使用
(1)编写带有throw 语句的程序TC5.java,源代码如下。 public class LX4_9 {
static void throwProcess() {
try {
throw new NullPointerException(\空指针异常\catch (NullPointerException e) {
System.out.println(\在 throwProcess 方法中捕获一个\throw e; } }
public static void main(String args[]) {
try {
throwProcess(); }
catch (NullPointerException e) {
System.out.println(\再次捕获:\} } }
(2)编译并运行程序,结果如图4.11 所示。
图4.11
(3)程序执行流程 程序首先调用throwProcess 方法,明确地抛出了一个NullPointerException 异常并将其命名为“空指针异常”。然后程序流程将转向throwProcess 方法中的catch 子句,输出一条信息。throwProcess 方法的catch 子句又抛出了一个同样的异常e。然后结束throwProcess 方法的调用,执行main 方法中的catch 子句,再次捕获这个异常。
3.带有捕获处理的throws 子句
(1)程序功能:在这个程序中的mathod 方法中使用throws 子句抛出异常,在main 方法中捕获处理异常。
(2)TC6.java,源代码如下。 import java.io.*; public class LX4_11{
static void mathod() throws IllegalAccessException {
System.out.println(\在 mathod 中抛出一个异常\
- 37 -
JAVA面向对象程序设计实验指导书
throw new IllegalAccessException();
}
public static void main(String args[]) {
try { mathod(); }
catch (IllegalAccessException e) {
System.out.println(\在 main 中捕获异常:\} } }
(3)编译并运行程序,结果如图4.13 所示。
图4.13
5. finally 子句的作用
当一个异常被抛出时,程序的执行流程就不再是连续的了,会跳过某些语句,甚至会由于没有与之匹配的catch 子句而过早地返回,结束程序的运行。为了确保一段代码不管发生什么异常都能被执行,可以使用finally 子句。每个try 语句至少都要有一个与之相配的catch 或finally 子句。
从一个方法中返回到调用它的另外一个方法,可以通过return 语句或通过一个没有被捕获的异常,但finally 子句总是在返回前被执行。
2. 创建使用finally 子句的程序文件LX4_12.java。
(1)程序功能:在类LX4_12 的mathodA 方法中使用try 子句捕获异常,使用finally 子句处理异常。在类LX4_11 的main 方法中使用try 子句捕获mathodA 异常,
(2)编写LX4_12.java 程序,源代码如下。 class LX4_12{
static void mathodA() {
try { System.out.println(\抛出一个异常\throw new RuntimeException(); }
finally {
System.out.println(\执行 mathodA 的 finally\} }
static void mathodB() {
try{
System.out.println(\正常返回\return; }
finally { System.out.println(\执行 mathodB 的 finally\}
public static void main(String args[]) {
try {
mathodA();
} catch (Exception e) {
mathodB(); }}}
(3)编译并运行该程序,,结果如图4.14 所示。
- 38 -
JAVA面向对象程序设计实验指导书
图4.14
注意:对于程序中需要处理的异常,一般要编写try-catch-finally 语句捕获并处理。 (十七) 创建自定义异常类
1.创建自定义异常类程序文件LX4_13.java
(1) 程序功能:通过继承Exception 异常类创建一个自定义异常类MyException, 然后再创建一个主类LX4_13 使用自定义异常类MyException。
(2)编写LX4_13.java 程序文件,源代码如下。
class MyException extends Exception {
private int x;
MyException(int a) { x=a; }
public String toString() {
return \自定义异常类MyException\} }
public class LX4_13 {
static void mathod(int a) throws MyException { // 声明方法会抛出MyException System.out.println(\此处引用 mathod (\if (a>10) throw new MyException(a); // 主动抛出 MyException System.out.println(\正常返回\}
public static void main(String args[]) { try {
System.out.println(\进入监控区,执行可能发生异常的程序段\mathod(8); mathod(20); mathod(6); }
catch (MyException e) {
System.out.println(\程序发生异常并在此处进行处理\System.out.println(\发生的异常为:\}
System.out.println(\这里可执行其它代码\(3)编译并运行程序,结果如图4.15 所示。
- 39 -
JAVA面向对象程序设计实验指导书
图4.15
(三) 使用输入输出流类
1. 使用标准数据流的应用程序
标准数据流指在字符方式下(如DOS 提示符)程序与系统进行输入输出的方式,键盘和显示器屏幕是标准输入输出设备,数据输入的起点为键盘,数据输出的终点是屏幕,输出的数据可以在屏幕上显示出来。
(1) 程序功能:将键盘上输入的字符在屏幕上显示出来。 (2) 编写LX5_3.java 程序文件,源代码如下。 class LX5_3{
public static void main(String[] args) throws java.io.IOException { byte buffer[]=new byte[10];
System.out.println(\从键盘输入不超过10 个字符,按回车键结束输入:\
int count =System.in.read(buffer);// 读取输入的字符并存放在缓冲区buffer 中 System.out.println(\保存在缓冲区buffer 中元素的个数为:\System.out.println(\中各元素的值为:\for (int i=0;i System.out.print(\在屏幕上显示buffer 元素的值 } System.out.println(); System.out.println(\输出buffer 字符元素:\System.out.write(buffer, 0, buffer.length); } } (3)编译LX5_3.java 文件。 (4)在命令提示符窗口运行LX5_3.class 文件,并输入1234,结果如图5.4 所示。 图5.4 思考:为什么缓冲区buffer 中元素的个数为显示的是6? 2. 使用文件输入输出流的应用程序 - 40 - JAVA面向对象程序设计实验指导书 (1)程序功能:将保存在本地机当前文件夹中的LX5_1.HTML 文本文件的内容在屏幕上显示出来,然后将其另存为LX5_1.txt 文件。 (2)编写LX5_4.java 程序文件,源代码如下。 import java.io.*; public class LX5_4 { public static void main(String[] args) throws IOException { FileReader in=new FileReader(\建立文件输入流 BufferedReader bin=new BufferedReader(in);//建立缓冲输入流 FileWriter out=new FileWriter(\建立文件输出流 String str; while ((str=bin.readLine())!=null) { //将缓冲区内容通过循环方式逐行赋值给字符串str System.out.println(str);// 在屏幕上显示字符串strout System..write(str+\将字符串str 通过输出流写入LX5_1.txt 中 } in.close(); out.close(); } } (3) 编译并运行程序,结果如图5.5 所示。 图5.5 (4) 在当前文件夹中找到LX5_1.txt 文件并打开,可看到如图5.6 所示内容。再运行一次程序,看看会发生什么变化。 图5.6 (5)总结:程序中使用了哪些数据流类,建立数据流的步骤。 3. 使用随机文件类的应用程序 思考:本程序中的数据流rf 有什么特点? 4. 使用数据输入输出流与文件输入输出流类的应用程序 使用数据输入流DataOutputStream 和数据输出流DataInputStream 可以读取或写入任何Java 类型的数据,不用关心它们的实际长度是多少字节。一般与文件输入流FileInputStream 和输出流类FileOutputStream 一起使用。 (1)程序功能:将整型数据和字符串对象通过数据输出流写到文件中。将文件中的整型数据和 字符串对象通过数据输出流读出,并在屏幕上显示文件中的内容。 思考:数据输入输出流的特点。 - 41 -