我有这种格式的文件:
Gray M 0 0 869 0 0 0 0 0 0 0 0 0 0 0 Mart M 722 957 0 0 0 0 0 0 0 0 0 0 0 0 Adolfo M 0 995 0 859 0 646 742 739 708 731 671 649 546 0 Livia F 0 0 0 0 0 0 0 0 0 0 0 0 0 826 Mearl M 0 0 947 0 0 0 0 0 0 0 0 0 0 0 Estel M 0 0 0 793 750 826 0 0 0 0 0 0 0 0 Lee F 300 333 278 256 281 310 283 268 218 298 364 955 0 0 Garnet F 0 704 663 464 421 665 721 0 0 0 0 0 0 0 Stephan M 0 0 0 922 0 0 757 333 387 395 487 406 721 0 (Last line in the file is a blank Line)
我的方法采用如下字符串:“Lee F”并将其与文件中一行的前两个标记进行比较。如果它匹配行上的前两个令牌,则返回两个令牌,如果它与文件中的任何内容都不匹配,则告诉用户它没有找到令牌。如果名称在文件中,我的程序运行正常,但如果名称不在文件中,则会出错:
Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at Names.findName(Names.java:36) at 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";
}
答案 0 :(得分:3)
String name= input.next();
String gend= input.next();
这似乎是一个问题(特别是如果你在最后一行)。您已经阅读了整行,为什么还要从input
进一步阅读?如果没有别的东西可读怎么办?在空格上只需split()
line
,并将前两个元素提取为name
和gend
:
String[] split = line.split("\\s+", 3);
String name = split[0];
String gend = split[1];
请注意,split()
的第二个参数表示该字符串最多只能拆分为3个(这是最佳的,因为我们只需要生成数组的前两个元素)。