0

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

编辑:教授说明:

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

我的代码如下:

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);

}

}
4

3 回答 3

3

当你只想增加一个计数器时,为什么要抛出异常?

看起来像你想要的,

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

现在,在您执行此操作之前,请确保数据是一个整数,如果您执行 .nextInt(如果有),您将获得该整数,并且将跳过所有其他非整数值。所以这取决于你读取数据的方式,为什么是扫描仪?为什么不使用缓冲阅读器和 readLine 然后拆分它做任何你喜欢的事情?

于 2012-04-26T17:57:47.240 回答
3

根据您的示例,您为什么还要使用异常?您正在做的不是处理错误,看起来您正在执行逻辑。错误应该是显示停止器,而不是用于在您的代码中执行逻辑。只是增加坏数据而不是使用异常。异常也会减慢您的代码速度。

于 2012-04-26T17:59:12.950 回答
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 ABC 4 5 6 -1 -2 CB

它会输出:

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

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

于 2012-04-26T18:09:03.463 回答