我有一个像这样定义的类,使用适当的getter和setter方法......
public class Album {
private int id;
private String artist;
private String name;
private int published;
}
我还有一个.csv文件,可以存储多个相册的内容。在文件中,一行代表一个专辑。
我正在尝试从.csv文件中读取信息,然后使用Album
类的setter来分配值。这是我的代码......
public Map<Integer, Album> load() {
Scanner scanner = new Scanner(fileName);
Map<Integer, Album> loadedAlbums = new HashMap<Integer, Album>();
while(scanner.hasNextLine()) {
Album album = new Album();
String[] albumDivided = scanner.nextLine().split(",");
//in the .csv file every unit of information is divided by a comma.
album.setId(Integer.parseInt(albumDivided[0])); //this is line 11.
album.setArtist(albumDivided[1]);
album.setName(albumDivided[2]);
album.setPublished(Integer.parseInt(albumDivided[3]));
loadedAlbums.put(album.getId(), album);
}
return loadedAlbums;
}
但是,尝试使用此代码,我得到以下异常:
java.lang.NumberFormatException:对于输入字符串:第11行的“albums.csv”。
请你帮我理解这个问题的原因。
答案 0 :(得分:1)
问题是由异常......
描述的您的NumberFormatException
行之一会触发Integer.parseInt()
。触发异常的代码行是第11行(根据异常消息) - 不确定这是哪一行,但可能是第一行Integer.parseInt()
行。
您的代码正在尝试将值“albums.csv”转换为数字,这显然不是。因此,在CSV文件中的某个位置,您必须有一行包含值 albums.csv 的行,并且该行所需的数字。
希望这有助于查明问题。
答案 1 :(得分:1)
由于您不希望此处的整个解决方案是解决问题的提示:
你应该看一下API documentation of the Scanner class。仔细查看需要单个String参数的构造函数(在代码中使用它时)。
答案 2 :(得分:1)
据我所知,albumDivided [0]将包含“1”。由于点,它将无法解析为整数。从csv文件中删除点,或者在将其解析为Integer之前创建一个删除点的新字符串。方法可能如下所示:
String newString;
for(int i=0;i<albumDivided[0].length-1;i++){ //length -1 to remove the dot
newString = newString + albumDivided[0].charAt(i); //get the string stored in albumDivided[0] and add each char to the new string
}