java - 为什么 Scanner 在读取文件时不转到下一行?
问题描述
我正在使用以下代码读取文件:
Scanner fscanner = null;
try {
fscanner = new Scanner(new File("spotify.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while(fscanner.hasNextLine()) {
String line = fscanner.nextLine();
Scanner lineScanner = new Scanner(line);
Album album = new Album();
if(lineScanner.next().equals("CD")) {
album.setComposers(lineScanner.next().replaceAll(",", "'s"));
album.setAlbumName(lineScanner.useDelimiter(",").next().trim());
album.setYear(lineScanner.next().trim());
fscanner.nextLine();
String c = album.getAlbumName();
String a = album.getComposers();
String y = album.getYear();
System.out.println(a+" "+c+" "+y);
}
else if(lineScanner.next().equals("SONGS")) {
ArrayList<String> songs = new ArrayList<String>();
ArrayList<String> songDur = new ArrayList<String>();
lineScanner.nextInt();
songs.add(lineScanner.useDelimiter(",").next());
songDur.add(lineScanner.next());
album.setSongs(songs);
album.setSongDurations(songDur);
for(int i=0, j=0;i<songs.size() && j<songDur.size();i++, j++)
System.out.println("SONG "+i+" "+songs.get(i).toString()+ " "+songDur.get(j).toString());
System.out.println(album.showSongs());
System.out.println(album.showSongDurations());
}
else if(lineScanner.next().equals("ADD")) {
Adds adds = new Adds();
adds.setCompanyName(lineScanner.useDelimiter(",").next().trim());
adds.setDuration(lineScanner.next());
}
}
该文件看起来像这样:
CDS
CD U2, Songs of Innocence, 2014
SONG 1, The Miracle, 4:15
SONG 2, Every Breaking Wave, 4:12
SONG 3, California, 4:00
SONG 4, Song for Someone, 3:47
CD Coldplay, Parachutes, 2000
SONG 1, Don’t Panic, 2:17
SONG 2, Shiver, 5:00
SONG 3, Spies, 5:19
SONG 4, Sparks, 3:47
SONG 5, Yellow, 4:27
CD ImagineDragons, Night Visions, 2015
SONG 1, Demons, 3:14
SONG 2, Monster, 2:57
ADDS
ADD ING Bank, 0:20
ADD Bol.com, 0:15
ADD Albert Heijn, 0:30
ADD Specsavers, 0:15
ADD Kruidvat, 0:10
ADD MediaMarkt.nl, 0:20
问题是我正在 NoSuchElementException
排队else if(lineScanner.next().equals("SONGS"))
。
我根本不知道为什么会发生这种情况,如果我删除了两个else-ifs
.
它给出的输出完全符合预期,但当我介绍那些else-ifs
.
我如何解决它?
解决方案
在第一行,您将读取第一个标记并检查它是否等于CD
; 然后如果不是,您将尝试读取另一个令牌(从同一行)以检查它是否等于SONGS
,这将在第一行引发错误,因为没有更多令牌可以从该行读取。
您将希望在 if/else if 之前将该行的第一个标记读入一个变量,并在您的条件中引用该变量,以便它们都检查一行的第一个标记。
作为旁注,我会避免使用两种不同的扫描仪;如果我没记错的话CD
,你在调用时错误地跳过了分支中的一行fscanner.nextLine();
,这只有在你到处使用相同的扫描仪时才有用(丢弃一行未使用的其余部分)。在这种情况下,nextLine 调用应该放在 if/else if 之后以避免重复。
推荐阅读
- javascript - 添加 retryWhen() 后未调用 Rxjs 订阅
- javascript - addLoadEvent 不能调用函数
- amazon-web-services - AWS EC2 实例配置文件凭证的到期时间
- javascript - 从 JS If 语句的 HTML 选择语句中获取值
- linux - Linux,键盘:将 LNG 重新映射到 AltGr
- java - 如何使用 JOption 从对象类的应用程序中输入公历
- c - 我尝试使用宏在我的操作系统中进行中断。这个结构在 C 中是什么意思?
- android - 华为手机出错。致命异常:com.google.android.gms.ads.internal.video.exoplayer3.ab 处的 java.lang.NullPointerException
- java - How to have my java application as an endpoint for webhook
- c# - 如何在 C# 中删除 OpenLdap 对象?