繁体   English   中英

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

[英]Using a try/catch block to catch exceptions with input from a file

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

编辑:教授说明:

在您的程序中,您需要两个异常来处理两种不良数据。 对于非整数读取,可以使用nextInt()方法从文件读取整数,如果数据不是整数,则将引发InputMismatchException。 您的程序必须捕获此异常。 要处理否定的读数,您可能需要声明自己的Exception类: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);

}

}

当您只想增加计数器时,为什么会引发异常?

看起来像你想要的

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

现在,在执行此操作之前,请确保数据是整数,如果执行.nextInt(如果有),则将获得该整数,并且所有其他非int值将被跳过。 因此,这取决于您以哪种方式读取数据,为什么要使用扫描仪? 为什么不使用缓冲的阅读器和readLine然后将其拆分成所需的内容呢?

根据您的示例,为什么还要使用例外? 您正在执行的操作不是处理错误,而是您似乎在执行逻辑。 错误应该是显示停止符,而不是用来执行代码中的逻辑。 只是增加不良数据,而不使用异常。 异常也会使您的代码变慢。

您无需遍历两个不同的流。 扫描仪就足够了。

    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

该假设与您期望的输出相对应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM