我正在读取一个文件,文件的每行并不总是具有相同数量的元素。有些线有2个元素,而其他可能有4或6个元素。所以我要做的是创建一个临时数组基于这一行的分割方式。这里的问题是,我得到了一个java.lang.NullPointerException for String[] currentLine
。但是程序仍然读取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();
}
}
BufferedReader
的readLine
方法最终将返回null
,表示没有更多的输入可读。
的回报:
包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则为空
但是,您已经设置了一个无限循环。您正在尝试处理一个不存在的行。
检查while
循环条件下line
是否为null
。这将在最后一行被处理完后停止循环。
while( (line = bufReader.readLine()) != null)
{
// Remove readLine call here
// The rest of the while loop body is the same
public String readLine()
of Buffered Reader的文档说:
包含行内容的字符串,不包括任何行终止字符,或null(如果已到达流的末尾
)https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html readLine ()
所以,你只是击中了文件的结尾,因为你从来没有离开while
。
你需要改变你的循环:
while((line = bufReader.readLine()) != null )
{
String[] currentLine = line.split(" "); // Error
String lineStartsWith = currentLine[0];
switch(lineStartsWith)
{
case "Name:" :
System.out.println(currentLine[1]);
break;
}
}