异常类型

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

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

  1. 大家好!
  2.     hello!
  3.     bye!

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

  1. 大家好!
  2. hello!
  3. bye!
  4. 大家好!hello!bye!

参考答案

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

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

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

 
  1. import org.junit.Test;
  2. public class TestBrAndPw {
  3.     /**
  4.      * 使用BufferedReader和PrintWriter
  5.      */
  6.     @Test
  7.     public void testBrAndPw() throws Exception {
  8.     }
  9. }

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

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

 
  1. import java.io.BufferedReader;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.PrintWriter;
  7. import org.junit.Test;
  8. public class TestBrAndPw {
  9.     /**
  10.      * 使用BufferedReader和PrintWriter
  11.      */
  12.     @Test
  13.     public void testBrAndPw() throws Exception {
  14.         FileInputStream fis = new FileInputStream("pw.txt");
  15.         InputStreamReader isr = new InputStreamReader(fis);
  16.         BufferedReader br = new BufferedReader(isr);
  17.         
  18.         String line = "";
  19.         String all = "";
  20.         
  21.         while ((line = br.readLine()) != null) {
  22.             all += line;
  23.             System.out.println(line);
  24.         }
  25.     }
  26. }

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

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

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

 
  1. import java.io.BufferedReader;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.PrintWriter;
  7. import org.junit.Test;
  8. public class TestBrAndPw {
  9.     /**
  10.      * 使用BufferedReader和PrintWriter
  11.      */
  12.     @Test
  13.     public void testBrAndPw() throws Exception {
  14.         FileInputStream fis = new FileInputStream("pw.txt");
  15.         InputStreamReader isr = new InputStreamReader(fis);
  16.         BufferedReader br = new BufferedReader(isr);
  17.         
  18.         String line = "";
  19.         String all = "";
  20.         
  21.         while ((line = br.readLine()) != null) {
  22.             all += line;
  23.             System.out.println(line);
  24.         }
  25.         OutputStream os=new FileOutputStream("pw.txt",true);
  26.         PrintWriter pw = new PrintWriter(os,true);
  27.         System.out.println(all);
  28.         pw.println();
  29.         pw.println(all);
  30.         br.close();
  31.         pw.close();
  32.     }
  33. }

运行上述代码,文本文件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捕获的异常类型由上至下,顺序应是子类到父类,例如如下代码:

 
  1.     try{
  2.     …
  3.     }catch(NullPointerException e){
  4.     …
  5.     }catch(RuntimeException e){
  6.      …    
  7.     }catch(Exception e){
  8.      …
  9.     }

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

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

 
  1. import java.io.FileNotFoundException;
  2. import java.io.FileOutputStream;
  3. public class Foo {
  4.     public void writeData(){
  5.         try {
  6.             FileOutputStream fos= new FileOutputStream("out.dat");
  7.             fos.write(1);
  8.             fos.close();
  9.         } catch (FileNotFoundException e) {
  10.             e.printStackTrace();
  11.         }
  12.     }
  13. }

参考答案

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

 
  1. import java.io.FileNotFoundException;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class Foo {
  5.     public void writeData() throws IOException{
  6.         try {
  7.             FileOutputStream fos= new FileOutputStream("out.dat");
  8.             fos.write(1);
  9.             fos.close();
  10.         } catch (FileNotFoundException e) {
  11.             e.printStackTrace();
  12.         }
  13.     }
  14. }

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方法可以输出错误信息,用来跟踪异常事件发生时执行堆栈的内容。

原文地址:https://www.cnblogs.com/xyk1987/p/8330951.html