1 读取文本文件中的每一行数据信息,求其和再存入最后一行

文本文件pw.txt的内容如下所示:

#cold_bold大家好!
#cold_bold	hello!
#cold_bold	bye!

操作完毕之后的文本文件pw.txt的内容如下所示:

#cold_bold大家好!
#cold_boldhello!
#cold_boldbye!
#cold_bold大家好!hello!bye!

参考答案

实现此案例需要按照如下步骤进行。

步骤一:新建TestBrAndPw类,添加测试方法testBrAndPw方法

首先,新建名为TestBrAndPw的类,并在类中添加单元测试方法 testBrAndPw,代码如下所示:

import org.junit.Test;

public class TestBrAndPw {
	/**
	 * 使用BufferedReader和PrintWriter
	 */
	@Test
	public void testBrAndPw() throws Exception {
	}
}

步骤二:读取文本文件的所有行

首先,创建BufferedReader类的对象,并调用该对象的 readLine 方法逐一读取文件中的每行文本连接为一个字符串,代码如下所示:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;

import org.junit.Test;

public class TestBrAndPw {
	/**
	 * 使用BufferedReader和PrintWriter
	 */
	@Test
	public void testBrAndPw() throws Exception {
#cold_bold		FileInputStream fis = new FileInputStream("pw.txt");
#cold_bold		InputStreamReader isr = new InputStreamReader(fis);
#cold_bold		BufferedReader br = new BufferedReader(isr);
#cold_bold		
#cold_bold		String line = "";
#cold_bold		String all = "";
#cold_bold		
#cold_bold		while ((line = br.readLine()) != null) {
#cold_bold			all += line;
#cold_bold			System.out.println(line);
#cold_bold		}
	}
}

步骤三:使用PrintWriter对象写出数据

PrintWriter是带有行刷新的缓冲字符输出流,它提供了丰富的重载print与println方法。其中,println方法在于输出目标数据后自动输出一个系统支持的换行符。

为向文本文件中追加信息,首先创建OutputStream类的对象,构造该对象时要使该对象具备追加功能;然后,使用OutputStream类的对象构造 PrintWriter类的对象,最后调用 println 方法写入文本,并关闭BufferedReader 对象和PrintWriter对象。代码如下所示:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;

import org.junit.Test;

public class TestBrAndPw {
	/**
	 * 使用BufferedReader和PrintWriter
	 */
	@Test
	public void testBrAndPw() throws Exception {
		FileInputStream fis = new FileInputStream("pw.txt");
		InputStreamReader isr = new InputStreamReader(fis);
		BufferedReader br = new BufferedReader(isr);
		
		String line = "";
		String all = "";
		
		while ((line = br.readLine()) != null) {
			all += line;
			System.out.println(line);
		}
#cold_bold		OutputStream os=new FileOutputStream("pw.txt",true);
#cold_bold		PrintWriter pw = new PrintWriter(os,true);
#cold_bold		System.out.println(all);
#cold_bold		pw.println();
#cold_bold		pw.println(all);
#cold_bold		br.close();
#cold_bold		pw.close();
	}
}

运行上述代码,文本文件pw.txt文件末尾多了一行数据,这一行的内容为pw.txt文本文件中的每一行数据信息累加的和。

2 简述Error和Exception的区别

参考答案

Java异常结构中定义有Throwable类,Exception和Error是其派生的两个子类。其中Exception表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常;而Error表示Java运行时环境出现的错误,例如:JVM内存资源耗尽等。

3 下面关于异常处理的说法正确的是

A.try … catch … catch,当多个catch时,后一个catch捕获类型一定是前一个的父类。

B.try…finally可以组合使用。

C.throw抛出的一些异常,程序不进行处理,程序编译也无错误。

D.throws一定是写在方法后面。

参考答案

本题正确答案为BCD。

本题中A选项说法错误,catch块可以捕获的异常类型是Throwable类及其子类类型,多个catch捕获的异常类型之间可以没有父子关系,但如果存在父子关系,则catch捕获的异常类型由上至下,顺序应是子类到父类,例如如下代码:

	try{
	…
	}catch(NullPointerException e){
	…
	}catch(RuntimeException e){
	      …	
	}catch(Exception e){
	      …
	}

子类型异常在前,父类型异常在后,这样的顺序依次捕获。否则编译不通过。

4 改正下面代码的编译错误

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Foo {
	public void writeData(){
		try {
			FileOutputStream fos= new FileOutputStream("out.dat");
			fos.write(1);
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

参考答案

上述代码中,除了产生FileNotFoundException异常外,还会产生IOException异常,但在上述代码中没有对IOException做出处理,因此出现编译错误。可以在catch块中捕获该异常,也可以使用throws将异常抛出给方法的调用者。在此,使用了throws将异常抛出,改正后的代码如下所示:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Foo {
	public void writeData() throws IOException{
		try {
			FileOutputStream fos= new FileOutputStream("out.dat");
			fos.write(1);
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

5 简述RuntimeException和非RuntimeException的区别

参考答案

Java异常可以分为可检测异常,非检测异常:

1)可检测异常:可检测异常经编译器验证。对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,则产生编译错误。

2)非检测异常:非检测异常不遵循处理或者声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常。

RuntimeException 类属于非检测异常,因为普通JVM操作引起的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在java应用程序中会频繁出现。因此它们不受编译器检查与处理或声明规则的限制。非RuntimeException为可检测异常,该异常经编译器验证。

6 写出5个常见的RuntimeException

参考答案

1)IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数

2)NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常

3)ArrayIndexOutOfBoundsException当使用的数组下标超出数组允许范围时,抛出该异常

4)ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常

5)NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

7 printStackTrace方法的作用在于?

参考答案

printStackTrace方法可以输出错误信息,用来跟踪异常事件发生时执行堆栈的内容。