Scanner s = new Scanner(new File("src/mail_list"));
while (s.hasNextLine()){
String line1 = s.nextLine();
if (line1.startsWith("Users")){
line1 = s.nextLine();
while (!(line1 = s.nextLine()).isEmpty()) {
String arr[] = line1.split(" ", 4);
users.add(new User(arr[0],arr[1],arr[2],arr[3]));
}
}
if (line1.startsWith("Lists")){
line1 = s.nextLine();
while (!(line1 = s.nextLine()).isEmpty()) { //exception here
String arr1[] = line1.split(" ", 2);
ArrayList<String> tmp = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(arr1[1]);
while (st.hasMoreTokens()) {
tmp.add(st.nextToken());
}
list.add(new List((arr1[0]), tmp));
}
}
}
/*-testfile-start*/
Keyword: Users
username1 Name1 Surname1 email1
username2 Name2 Surname2 email2
Keyword: Lists
list_name username1 username2 ...
/*-testfile-end*/
我使用上面的代码来从上面的testfile模式中对事物进行排序。基本上它意味着如果我遇到关键字&#34;用户&#34;我必须添加关于用户的所述信息。
我在代码中标记了异常上升的地方。关于如何应对它的任何想法?
答案 0 :(得分:1)
您正在拨打nextLine()
两次,但只检查hasNextLine()
一次。
String line1 = s.nextLine();
if (line1.startsWith("Users")){
line1 = s.nextLine();
意味着你在不知道是否存在下一行的情况下获取下一行,如果没有,则抛出异常。
答案 1 :(得分:1)
我找到了一个愚蠢的解决方案。我刚刚在最后一行之后添加了一个'虚拟'字符2行。它的工作原理。它不是一个完美的解决方案,但由于测试文件不是任何人都能看到的,我现在就把它拿走...... 感谢所有与我一起集思广益45分钟的人。
答案 2 :(得分:0)
Do!(line1 = s.nextLine())!= null,不为空,因为它无法读取空行。
答案 3 :(得分:0)
<强>抛出:强>
NoSuchElementException
- 如果没有找到任何行。
你有这个代码:
while (s.hasNextLine()) {
//checked if there's line to read
String line1 = s.nextLine();
if (line1.startsWith("Users")) {
//not checked if there's line to read
line1 = s.nextLine();
//not checked here either
while (!(line1 = s.nextLine()).isEmpty()) {
String arr[] = line1.split(" ", 4);
users.add(new User(arr[0],arr[1],arr[2],arr[3]));
}
}
//similar in code below...
}
确保在使用Scanner#nextLine
之前验证要读取的行。相应地处理例外情况。
答案 4 :(得分:0)
如您所见,此方法在未找到任何行时抛出NoSuchElementException。
if (line1.startsWith("Lists")){
line1 = s.nextLine(); // <=============== ?
while (!(line1 = s.nextLine()).isEmpty()) { //exception here
您如何知道在那里和评论栏中有更多行?