从String.split创建数组时出现NullPointerException

时间:2015-06-01 19:07:49

标签: java arrays file

我正在读取文件,文件的每一行并不总是具有相同数量的元素。一些行有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();
            }
        }

3 个答案:

答案 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;
  }
}