2

ここで何が間違っているのか疑問に思っています。ファイルから読み取り、いくつかのデータを解析しようとしています。数字を解析できないというエラー「java.lang.NumberFormatException」が発生し続けます。getNextDouble() または get nextInt() を使用していることは知っていますが、コードをできるだけ一般的なものにしようとしています。どんな考えでも大歓迎です。タイ。

ここに私のテキストファイルからの行のサンプルがあります:

       foo Bar 19.35 55 987.0054 4 

public void readFile(){
        int i=0;
        String line;

        try{
            fileIn = new Scanner(new File("pa1Names.txt"));
        }catch(Exception e){
            System.out.println("Fatal Error: File was not opened");
        }

        while(i<names.length && fileIn.hasNext()){
            line = fileIn.nextLine();
            StringTokenizer st = new StringTokenizer(line);
            int m = st.countTokens();

            names[i] = st.nextToken();

            for (int k = 0; k<m-5; k++)
            {
                names[i] = names[i] + " " + st.nextToken();
            }

            reals[i][0] = Double.parseDouble(st.nextToken());
            ints[i][0]  = Integer.parseInt(st.nextToken());
            reals[i][1] = Double.parseDouble(st.nextToken());
            ints[i][1]  = Integer.parseInt(st.nextToken());

            i++;
        }//end while
        fileIn.close();
    }
4

4 に答える 4

1

私がよく理解していれば、あなたの例では

foo Bar

st.nextToken を 2 回ではなく 3 回読み取ります。おそらく、次のようなものを使用する必要があります。

names[i] = "";

for (int k = 0; k<m-4; k++)
{
    names[i] = names[i] + " " + st.nextToken();
}
于 2013-08-30T03:58:42.147 に答える
1

コードからの削除 names[i] = st.nextToken();は正常に機能するはずです。

for問題は、ループ内に入る前に最初のトークンを読んでいたことでした

于 2013-08-30T04:08:34.047 に答える
0

String.split() を使用して、最初にトークンを配列に分離し、次にそれらを 1 つずつ解析することができます。

String line = "foo Bar 19.35 55 987.0054 4 ";
String[] arr = line.split("[\s]+");
int m = arr.length;

.......
reals[i][0] = Double.parseDouble(arr[m - 4]);

データ形式を管理している場合は、標準の CSV を使用することをお勧めします。

于 2013-08-30T04:27:07.840 に答える