我正在读取文件,文件的每一行并不总是具有相同数量的元素。一些行有2个元素,而其他行可能有4或6个元素。所以我正在做的是根据线的分割方式创建一个临时数组。这里的问题是我得到String[] currentLine
的java.lang.NullPointerException。但该程序仍然会读取currentLine[1]
:
boolean needData = true;
String path = "foo/" + filename + ".bar";
File dataFile = null;
BufferedReader bufReader = null;
String line = null;
if (needData) // always true
{
try
{
dataFile = new File(path);
FileReader fr = new FileReader(dataFile);
bufReader = new BufferedReader(fr);
if (file.exists())
{
while(true)
{
line = bufReader.readLine();
String[] currentLine = line.split(" "); // Error
String lineStartsWith = currentLine[0];
switch(lineStartsWith)
{
case "Name:" :
System.out.println(currentLine[1]);
break;
}
} // end while loop
}
bufReader.close();
}
catch (FileNotFoundException e)
{
System.err.println("Couldn't load " + filename + ".bar");
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
答案 0 :(得分:5)
BufferedReader
's readLine
method最终将返回null
,表示没有更多要阅读的内容。
返回:
包含行内容的字符串,不包括任何行终止字符;如果已到达流的末尾,则为null
但是,您已设置了无限循环。您正试图处理一条不存在的行。
在line
循环的条件下检查null
是否为while
。一旦最后一行已被处理,这将停止循环。
while( (line = bufReader.readLine()) != null)
{
// Remove readLine call here
// The rest of the while loop body is the same
答案 1 :(得分:1)
Buffered Reader public String readLine()
的文档说:
包含行内容的字符串,不包括任何行终止字符,或null (如果已到达流末尾)
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()
所以,你只是在文件的末尾,因为你永远不会离开while
。
答案 2 :(得分:0)
你需要改变循环:
while((line = bufReader.readLine()) != null )
{
String[] currentLine = line.split(" "); // Error
String lineStartsWith = currentLine[0];
switch(lineStartsWith)
{
case "Name:" :
System.out.println(currentLine[1]);
break;
}
}