我创建了一个用Java读取文件的方法。有问题的文件包含一系列具有以下格式的书籍:lastname | firstname | title。但是,当我尝试使用该方法时,我收到一条错误消息。我的方法如下:
private final static char END_SIGN = '|';
void readBookFile(String readFile) {
try {
FileReader textFileReader = new FileReader(readFile);
BufferedReader textReader = new BufferedReader(textFileReader);
int numberOfBooks = Integer.parseInt(textReader.readLine());
for (int i = 0; i < numberOfBooks; i++) {
String post = textReader.readLine();
int index1 = post.indexOf(END_SIGN);
int index2 = post.indexOf(END_SIGN, index1 + 1);
String lastname = post.substring(0, index1);
String firstname = post.substring(index1 + 1, index2);
String title = post.substring(index2 + 1);
Book book = new Book(lastname, firstname, title);
addBook(book);
}
tekstReader.close();
}
catch (IOException exception) {
System.out.print("Wrong file reading: " + exception);
System.exit(1);
}
}
当我尝试运行此方法时,我收到错误消息:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Twain|Mark|The Adventures of Huckleberry Finn"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Library.readBookFile(Library.java:36)
at LibraryTest.main(LibraryTest.java:8)
第36行是我识别整数numberOfBooks的方法的一部分。所以显然这不是出于某种原因。如果有人知道什么可能导致这种情况,我将非常感激!
答案 0 :(得分:5)
int numberOfBooks = Integer.parseInt(textReader.readLine());
readLine()
此处返回文本文件第一行的文本。第一行似乎是Twain|Mark|The Adventures of Huckleberry Finn
,而不是文件中有多少本书。
你期望文件的第一行是什么?
答案 1 :(得分:4)
显然,文件的第一行不是一个数字 - 它是错误消息中显示的行。你需要检查你的文件。
其他一些注意事项:
finally
区块FileReader
支持的所有编码,使其成为一种无用的类型。而是创建一个FileInputStream
并将其包装在InputStreamReader
中,指定编码。 Guava使用Files
类:
List<String> lines = Files.readLines(new File(readFile), Charsets.UTF_8);
// All the IO is now done...
答案 2 :(得分:4)
您正在阅读的行不是数字。这是一本书的名称,所以当它试图将其作为数字读取时,它会给出错误。当您查看输入文件时,您确定它以要跟随的行数开头吗?
答案 3 :(得分:3)
而不是这段代码:
int numberOfBooks = Integer.parseInt(textReader.readLine());
for (int i = 0; i < numberOfBooks; i++) {
String post = textReader.readLine();
int index1 = post.indexOf(END_SIGN);
int index2 = post.indexOf(END_SIGN, index1 + 1);
String lastname = post.substring(0, index1);
String firstname = post.substring(index1 + 1, index2);
String title = post.substring(index2 + 1);
Book book = new Book(lastname, firstname, title);
addBook(book);
}
试试这个:
String post = textReader.readLine();
while (post != null) {
int index1 = post.indexOf(END_SIGN);
int index2 = post.indexOf(END_SIGN, index1 + 1);
String lastname = post.substring(0, index1);
String firstname = post.substring(index1 + 1, index2);
String title = post.substring(index2 + 1);
Book book = new Book(lastname, firstname, title);
addBook(book);
post = textReader.readLine();
}
此外,就像Jon Skeet建议的那样,您应该重新安排代码以确保即使输入处理引发异常也会关闭输入。 (try ... finally
构造对此有好处。)
答案 4 :(得分:2)
代码假设文件以整数开头,书籍数量单独在第一行。显然,这不存在于您的数据文件中。
答案 5 :(得分:2)
错误已经说明了:你不能用字符串创建一个整数:“吐温|马克|哈克贝利芬恩历险记”:这不是数字表达。
答案 6 :(得分:1)
int numberOfBooks = Integer.parseInt(textReader.readLine());
textReader.readLine()返回的行(String)不是数字,因为它返回:
"Twain|Mark|The Adventures of Huckleberry Finn"
答案 7 :(得分:1)
鉴于“有问题的文件包含具有以下格式的书籍列表:姓氏|名字|标题。”
在for循环之前尝试int numberOfBooks = Integer.parseInt(textReader.readLine());
时会抛出异常,因为它无法转换|将字符串分隔为整数。
假设每行1本书,书籍数量就是总行数......