0

我有一个这种格式的文件:

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

玛特 M 722 957 0 0 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 0 0 826

米尔 M 0 0 947 0 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”的字符串,并将其与文件中一行的前两个标记进行比较。如果它匹配行上的前两个标记,则返回这两个标记,如果它不匹配文件中的任何内容,则告诉用户它没有找到标记。如果名称在文件中,我的程序运行良好,但如果名称不在文件中,则会出错:

线程“主”中的异常
 java.util.NoSuchElementException
    在 java.util.Scanner.throwFor(未知来源)
    在 java.util.Scanner.next(未知来源)
    在 Names.findName(Names.java:36)
    在 Names.main(Names.java:9)

发生这种情况是因为我的 if 语句检查空行似乎不适用于文件中的最后一个空行,并且我的代码试图从最后一行获取两个标记......为什么它没有跳过在文件中的最后一个空白行?

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?如果没有其他读物怎么办?仅在空格上并将前两个元素提取为和:split() linenamegend

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

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

请注意,第二个参数split()表示字符串最多只能拆分为 3 个部分(这是最优的,因为我们只需要结果数组的前两个元素)。

于 2014-02-12T01:34:59.823 回答