我正在尝试逐行读取文件,但每次运行程序时,我都会在行spaceIndex = line.indexOf(" ");
处得到NullPointerException,这显然意味着该行为空。然而。我知道我正在使用的文件正好有7行(即使我打印numLines
的值,我得到值7.然而当我尝试读取一行时,我仍然得到nullpointerexception进入我的字符串。
// File file = some File I take in after clicking a JButton
Charset charset = Charset.forName("US-ASCII");
try (BufferedReader reader = Files.newBufferedReader(file.toPath(), charset)) {
String line = "";
int spaceIndex;
int numLines = 0;
while(reader.readLine()!=null) numLines++;
for(int i = 0; i<numLines; i++) {
line = reader.readLine();
spaceIndex = line.indexOf(" ");
System.out.println(spaceIndex);
}
PS :(我实际上并没有使用这段代码打印空间的索引,我替换了循环中的代码,因为它有很多,而且会让它读起来更长)
如果我要以错误的方式阅读这些内容,那么如果有人可以提出另一种方式,这将是很好的,因为到目前为止,我尝试的每一种方式都给了我同样的例外。感谢。
答案 0 :(得分:5)
当你开始for
循环时,阅读器已经在文件的末尾
(来自while
循环)。
因此,readLine()
将始终返回null
。
你应该摆脱for
循环,并在第一次阅读文件时在while
循环中完成所有工作。
答案 1 :(得分:1)
您有两种选择。
首先,您可以通过以下方式读取文件中的行数:
LineNumberReader lnr = new LineNumberReader(new FileReader(new File("File1")));
lnr.skip(Long.MAX_VALUE);
System.out.println(lnr.getLineNumber());
然后立即阅读文件:
while((line = reader.readLine())!=null)
{
spaceIndex = line.indexOf(" ");
System.out.println(spaceIndex);
}
这第一个选项是另一种选择(在我看来,更酷)这样做的方式。
第二个选项(可能更明智)是在while循环中一次完成所有操作:
while((line = reader.readLine())!=null)
{
numLines++;
spaceIndex = line.indexOf(" ");
System.out.println(spaceIndex);
}