1

ファイルからの入力を受け取り、都市とその降雨量のリストを出力するプログラムを書いています。必要な配列の長さと都市の降雨データを決定するスキャナーに問題があります。

この例外が発生し続けます

スレッド「メイン」での例外 java.util.Scanner.throwFor(Scanner.java:909) での java.util.InputMismatchException Scanner.java:2160) で java.util.Scanner.nextInt(Scanner.java:2119) で BarChart.main(BarChart.java:29) で

これが私のコードです:

import java.util.Scanner;

public class BarChart
{
    public static void main (String[] args)
    {
        //create scanner
        Scanner scan = new Scanner(System.in);

        //create size variable
        int size = scan.nextInt();

        //create arrays to hold cities and values
        String[] cities = new String [size];
        int[] values = new int [size];

        //input must be correct
        if (size > 0)
        {
            //set values of cities
            for(int i=0; i<size; i++)
            {
                cities[i] = scan.nextLine();
            }

            //set values of the data
            for(int j=0; j<size; j++)
            {
                values[j] = scan.nextInt();
            }

            //call the method to print the data
            printChart(cities, values);
        }
        //if wrong input given, explain and quit
        else
        {
            explanation();
            System.exit(0);
        }
    }

    //explanation of use
    public static void explanation()
    {
        System.out.println("");
        System.out.println("Error:");
        System.out.println("Input must be given from a file.");
        System.out.println("Must contain a list of cities and rainfall data");
        System.out.println("There must be at least 1 city for the program to run");
        System.out.println("");
        System.out.println("Example: java BarChart < input.txt");
        System.out.println("");
    }

    //print arrays created from file
    public static void printChart(String[] cities, int[] values)
    {
        for(int i=0; i<cities.length; i++)
        {
            System.out.printf( "%15s %-15s %n", cities, values);
        }
    }
}
4

3 に答える 3

2

ファイルで、リストのサイズが最初の行の唯一のものである場合、つまり次のようになります。

2
London
Paris
1
2

次に、都市名を読み取るために for ループに入ると、スキャナはまだ最初の改行を読み取っていません。上記の例では、 への呼び出しは、 andではなくnewLine()空白行 and を読み取ります。LondonLondonParis

したがって、降雨データを読み取る 2 番目の for ループに到達すると、スキャナーはまだ最後の都市 (上記の例) を読み取っておらず、都市名が明らかに有効な ではないため、Parisをスローします。InputMismatchExceptionint

于 2013-10-18T23:15:39.237 に答える
0

この質問のように、目的のパターン (int) に一致する別のトークンがあるかどうかも確認する必要があります。

を呼び出す前に、 scanner.hasNextInt()で確認してくださいnextInt()

于 2013-10-18T23:16:59.780 に答える
0

エラー メッセージとエラーが発生した場所に基づいて、整数を読み取ろうとしている可能性が最も高いですが、読み取っている実際のデータは数値ではありません。

scan.nextInt()を a に変更し、scan.next()実際に取得した値を出力することで、これを確認できます。または、次の形式の「エラー処理」を追加することもできます。

       for(int j=0; j<size; j++)
        {
          if (scan.hasNextInt()
            values[j] = scan.nextInt();
          else
            throw new RuntimeException("Unexpected token, wanted a number, but got: " + scan.next());
        }
于 2013-10-18T23:17:38.877 に答える