使用try / catch块来捕获来自文件的输入的异常

时间:2012-04-26 17:53:03

标签: java

我很确定我的问题在某个地方的try块中存在,但我似乎无法确定它。我正在做的是从文件中读取并检查输入。如果输入> 0,我想增加goodData,如果没有,它应该为值< 0抛出BPIllegalValueException,或者对非整数的东西抛出InputMismatchException。我希望你们能帮帮忙。

编辑:教授说明:

  

在您的程序中,您需要两个例外来处理两种不良数据。对于非整数读取,可以使用nextInt()方法从文件中读取整数,如果数据不是整数,则抛出InputMismatchException。您的程序必须捕获此异常。要处理否定读数,您可能希望声明自己的Exception类:BPIllegalValueException(您应该编写包含该类的BPIllegalValueException.java),并在读取负值时抛出此异常。注意:读取错误数据时,程序不应终止。因此,您必须使用try / catch块来处理错误数据。您的程序预计会打印出(在屏幕上)良好的血压读数和不良数据的数量。

我的代码如下:

import java.io.*;
import java.util.*;

public class DemoEx {

public static void main(String[] args) throws IOException
{
    FileReader fr = new FileReader("BP.txt");
    BufferedReader br = new BufferedReader(fr);
    Scanner in = new Scanner(new FileReader("BP.txt"));
    int badData = 0;
    int goodData = 0;
    int data;
    String str = "";

    while((str = br.readLine()) != null)
    {   
        try
        {
            data = in.nextInt();
            if(data>0)
                goodData++;
            else if(data<0)
                throw new BPIllegalValueException(data);
            else
                throw new InputMismatchException();
        }

        catch(InputMismatchException ex)
        {
            badData++;
        }

        catch(BPIllegalValueException ex)
        {
            badData++;
        }
    }

    System.out.println("The number of good data: " + goodData);
    System.out.println("The number of bad data: " + badData);

}

}

3 个答案:

答案 0 :(得分:3)

为什么在只想增加一个计数器时会抛出异常?

看起来你想要,

if (data > 0) 
    goodData++ 
 else 
     badData++;

现在,在你这样做之前,确保数据是一个整数,如果你这样做,你将得到.nextInt,如果有的话,将跳过所有其他的非int值。那么它取决于您读取数据的方式,扫描仪的原因?为什么不是缓冲读取器和readLine然后拆分它做任何你喜欢的事情?

答案 1 :(得分:3)

根据您的示例,您为什么甚至使用例外?你正在做的不是处理错误,看起来你正在执行逻辑。错误应该显示停止,而不是用于在代码中执行逻辑。只是增加坏数据而不是使用异常。例外情况也会降低您的代码速度。

答案 2 :(得分:0)

您不需要迭代两个不同的流。扫描仪应该足够了。

    BufferedReader br = new BufferedReader(new FileReader("BP.txt"));
    Scanner in = new Scanner(br);

此外,您不应该使用控制流的异常,而是使用if / else语句。

        if(data > 0){
            goodData++;
        }else { //if (data <= 0)
            badData++;
        }

循环应该由扫描仪控制,扫描仪是寻找数字的那个:

    while(in.hasNext()){ ... }

最后,如果你的文件包含不同于数字的其他标记,请确保迭代它们,否则你将编程无限循环:

        if(in.hasNextInt()){
            data = in.nextInt();
        }else{
            in.next(); //makes sure you move to the next token if it is not an int.
        }

总的来说,这样的事情:

    BufferedReader br = new BufferedReader(new FileReader("BP.txt"));
    Scanner in = new Scanner(br);
    int badData = 0;
    int goodData = 0;
    int data = 0; //this must be initialized

    while(in.hasNext()){
        if(in.hasNextInt()){
            data = in.nextInt();
            if(data > 0){
                goodData++;
            }else if (data <= 0){
                badData++;
            }
        }else{
            in.next(); //move to the next token when it-s not an int.
        }

    }

System.out.println("The number of good data: " + goodData);
System.out.println("The number of bad data: " + badData);

如果您将BP.txt文件包含为:1 2 A B C 4 5 6 -1 -2 C B

它会输出:

The number of good data: 8
The number of bad data: 4

假设对应于您期望的输出。