0

私の問題はどこかのtryブロックに存在すると確信していますが、それを特定することはできません。私がやっていることは、ファイルから読み取り、入力をチェックすることです。入力が>0の場合、goodDataをインクリメントしたいのですが、そうでない場合は、値が0未満の場合はBPIllegalValueExceptionをスローするか、整数でない場合はInputMismatchExceptionをスローする必要があります。私はあなたたちが助けることができることを望んでいました。

編集:教授の指示:

プログラムでは、2種類の不良データを処理するために2つの例外が必要です。非整数読み取りの場合、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);

}

}
4

3 に答える 3

3

カウンターを増やしたいだけなのに、なぜ例外をスローするのですか?

ご希望のようですが、

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

ここで、これを行う前に、data が整数であることを確認してください。これは、.nextInt を実行した場合に得られます。int 以外の値はすべてスキップされます。データを読み取る方法によって異なりますが、なぜスキャナーを使用するのでしょうか。バッファリングされたリーダーと readLine を分割して、好きなことをしてみませんか?

于 2012-04-26T17:57:47.240 に答える
3

あなたの例に基づいて、なぜ例外を使用しているのですか? あなたがしていることはエラーの処理ではなく、ロジックを実行しているように見えます。エラーは、コードでロジックを実行するために使用されるのではなく、ストッパーを表示する必要があります。例外を使用する代わりに、不良データをインクリメントするだけです。例外は、コードの速度を低下させる可能性もあります。

于 2012-04-26T17:59:12.950 に答える
0

2 つの異なるストリームを反復処理する必要はありません。スキャナーで十分です。

    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 に答える