3

次のコードは、テキスト ファイルに格納されている数値の平均を計算します。「ファイルが見つかりません」エラーの例外処理を追加しました。テキスト ファイル内のデータが数値でない (または int でない) 場合に別の例外を追加する方法を知る必要があります。複数のキャッチを追加することを考えました。方法がわからない?

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

public class NumAvg2 {

    public static void main(String[] args)
    {
    int c = 1;  
    long sum = 0;
    String strFileName;

    strFileName = args[0];

    Scanner scFileData;
    try{
        scFileData = new Scanner (new File(strFileName));

        while (scFileData.hasNext())
        {
            sum = sum + scFileData.nextInt();
            c++;
        }

    scFileData.close();
    System.out.println("Number of integers: " + (c - 1)); 
    System.out.println( "Average = " + (float)sum/(c - 1));

    } catch (FileNotFoundException e) {
        System.out.println("File not found!");
        System.exit(1);
    }

  } 
}   
4

7 に答える 7

6

必要に応じて、Java 7 のマルチ キャッチを使用できます。

try {
...
}
catch (FileNotFoundException|InputMismatchException ex) {
//deal with exception
}

これは、複数のキャッチよりも少しクリーンです。これらの例外のいずれかがスローされた場合、単一の catch ブロックでキャッチされます

于 2012-09-26T19:20:52.410 に答える
3

次のトークンが整数でない場合にScanner.nextIntもスローされることに注意してください。InputMismatchException

ドキュメントから:

例外: InputMismatchException - 次のトークンが Integer 正規表現と一致しない場合、または範囲外の場合

InputMismatchExceptionであるため、ブロックRuntimeException内で無視できますが、明示的に処理することもできます。try/catch

try
{
    // ... Scanner.nextInt
}
catch (FileNotFoundException e)
{
    System.out.println("File not found!");
    System.exit(1);
}
catch (InputMismatchException e)
{
    // ... not an int
}
于 2012-09-26T19:18:01.083 に答える
3
...
} catch (FileNotFoundException e) {
    System.out.println("File not found!");
    System.exit(1);
} catch (InputMismatchException e) {
    // Add stuff into your new exception handling block
}
...

InputMismatchException は RuntimeException (チェックされていない例外) であるのに対し、FileNotFoundException は通常のチェックされた例外であるため、IDE はこれについて文句を言わなかった可能性があります。

于 2012-09-26T19:19:46.740 に答える
3
} catch (InputMismatchException e) {
    System.out.println("Not integer!");
    System.exit(1);
} catch (FileNotFoundException e) {
    System.out.println("File not found!");
    System.exit(1);
}
于 2012-09-26T19:20:52.537 に答える
2

複数の例外をキャッチするには、次のようにチェーンします。

public class NumAvg2 {

public static void main(String[] args)
{
int c = 1;  
long sum = 0;
String strFileName;

strFileName = args[0];

Scanner scFileData;
try{
    scFileData = new Scanner (new File(strFileName));

    while (scFileData.hasNext())
    {
        sum = sum + scFileData.nextInt();
        c++;
    }

scFileData.close();
System.out.println("Number of integers: " + (c - 1)); 
System.out.println( "Average = " + (float)sum/(c - 1));

} catch (FileNotFoundException e) {
    System.out.println("File not found!");
    System.exit(1);
} catch(InputMismatchException e){
    //handle it
}
} 
}
于 2012-09-26T19:19:17.553 に答える
1

データをファイルから整数に変換する場所はどこですか?? そこにtry-catchを1つ追加する必要があります..

TypeMismatch の例外をキャッチする必要がある以下の while ループを使用する代わりに: -

    while (scFileData.hasNext()) {
        try {
            sum = sum + scFileData.nextInt();
            c++;
        } catch (InputMismatchException e) {
            System.out.println("Invalid Input");
        }
    }

以下のようなバリエーションを使用できます。

    while (scFileData.hasNextInt())
    {
        sum = sum + scFileData.nextInt();
         c++;
    }

scanner.hasNextInt()整数で入力されたかどうかを自動的にチェックします..

また、try-catch ブロックの外側で変数を宣言しているため、大きな try-catch ブロックを使用しないことをお勧めします。

むしろfile reading、ステートメントを try-catch で囲むことができます (それは 1 つのステートメントになります)。次に、いくつかのステートメントの後、scanner.nextInt()別の try-catchを再び囲むことができます。

だから、私はこのようにあなたのコードを変更します: -

public class NumAvg2 {

public static void main(String[] args)
{
    int c = 1;  
    long sum = 0;
    String strFileName;

    strFileName = args[0];

    Scanner scFileData;

    try{
        scFileData = new Scanner (new File(strFileName));

    } catch (FileNotFoundException e) {
        System.out.println("File not found!");
        System.exit(1);
    }
    while (true) {
        if (scFileData.hasNextInt())
        {
            sum = sum + scFileData.nextInt();
            c++;
            break;
        } else {
            System.out.println("Enter an integr");
        }
    }

    scFileData.close();
    System.out.println("Number of integers: " + (c - 1)); 
    System.out.println( "Average = " + (float)sum/(c - 1));

}
}

このようにして、コードがよりきれいになります.. *ただの提案..

于 2012-09-26T19:18:13.663 に答える
1
} catch (FileNotFoundException | InputMismatchException e) {
    e.printStackTrace();
    System.exit(1);
}
于 2012-09-26T19:20:44.920 に答える