0

次の形式のファイルがあります。

灰色 M 0 0 869 0 0 0 0 0 0 0 0 0 0

マート M 722 957 0 0 0 0 0 0 0 0 0 0

アドルフォ M 0 995 0 859 0 646 742 739 708 731 671 649 546 0

リヴィア F 0 0 0 0 0 0 0 0 0 0 0 826

マール M 0 0 947 0 0 0 0 0 0 0 0 0 0

エステル M 0 0 0 793 750 826 0 0 0 0 0 0 0 0

リー F 300 333 278 256 281 310 283 268 218 298 364 955 0 0

ガーネット F 0 704 663 464 421 665 721 0 0 0 0 0 0 0

ステファン M 0 0 0 922 0 0 757 333 387 395 487 406 721 0

(ファイルの最終行は空行です)

私のメソッドは、"Lee F" のような文字列を取り、それをファイル内の行の最初の 2 つのトークンと比較します。行の最初の 2 つのトークンに一致する場合は、2 つのトークンを返します。ファイル内の何も一致しない場合は、トークンが見つからなかったことをユーザーに通知します。名前がファイルにある場合、私のプログラムは正常に実行されますが、名前がファイルにない場合はエラーが発生します。

スレッド「メイン」での例外
 java.util.NoSuchElementException
    java.util.Scanner.throwFor (不明なソース) で
    java.util.Scanner.next で (不明なソース)
    Names.findName で (Names.java:36)
    Names.main(Names.java:9)で

これは、空白行をチェックする if ステートメントがファイルの最後の空白行で機能していないようで、コードがその最後の行から 2 つのトークンを取得しようとしているために発生しています...なぜスキップしないのですか?ファイルの最後の空白行に?

public static String findName(String nameGend) throws FileNotFoundException {
        Scanner input = new Scanner(new File("names.txt"));
        while (input.hasNextLine()) {
            String line = input.nextLine();
            if (!(line.isEmpty())) {
                String name= input.next();
                String gend= input.next();
                String nameGend2= name+ " " + gend;
                if (nameGend.equalsIgnoreCase(nameGend2)) {
                    input.close();
                    return nameGend2;
                }
            }
        }
        input.close();
        return "name/gender combination not found";
    }
4

1 に答える 1

3
String name= input.next();
String gend= input.next();

これは問題のようです (特に最後の行にいる場合)。すでに行全体を読んでいるのに、なぜそれ以上読む必要があるのinputですか? 他に読むものがなかったら?スペースだけで、最初の 2 つの要素をandとして抽出します。split() linenamegend

String[] split = line.split("\\s+", 3);

String name = split[0];
String gend = split[1];

の 2 番目の引数はsplit()、文字列を最大 3 つの部分にのみ分割する必要があることを示していることに注意してください (結果の配列の最初の 2 つの要素のみが必要なため、これが最適です)。

于 2014-02-12T01:34:59.823 に答える