【问题标题】:How to stop a NullPointerException when using BufferedReader (readLine()) to check for any more values使用 BufferedReader (readLine()) 检查更多值时如何停止 NullPointerException
【发布时间】:2014-01-13 21:06:50
【问题描述】:

我编写了一些代码来从 .txt 文件中读取车辆数据。目前我可以正确读取所有数据并很好地创建对象。我有一个 while 循环,用于检查文件中的文本“车辆详细信息”,如果存在(即要添加另一辆车),它将进入循环以添加数据。

问题是当不再有数据时,仍然会调用 readLine() 方法,这会创建 NullPointerException(至少我认为这是原因)

这里是使用的方法。

public static void addNewVehicleFromFile(Showroom s)
{
    try
    {
        FileInputStream fStream = new FileInputStream("AddVehicleFromFile.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fStream));
        String stringLine;

        while ((stringLine = br.readLine()).equalsIgnoreCase("Vehicle Details"))
        {
            System.out.println("P1");//Testing
            br.readLine();

            String[] manufacturer = br.readLine().split(" =");
            String[] model = br.readLine().split(" =");
            String[] vin = br.readLine().split(" =");
            String[] dateOfMan = br.readLine().split(" =");
            String[] taxBand = br.readLine().split(" =");
            String[] cost = br.readLine().split(" =");

            System.out.println("P2");//Testing
            System.out.println(manufacturer[0].toString());
            System.out.println(model[0].toString());
            System.out.println(vin[0].toString());
            System.out.println(dateOfMan[0].toString());
            System.out.println(taxBand[0].toString());

            br.readLine();

            System.out.println("P3");//Testing

            int strToInt = Integer.parseInt(cost[0]);

            Vehicle inputVehicle = new Vehicle(manufacturer[0], model[0], vin[0], dateOfMan[0],
                    taxBand[0].charAt(0), strToInt);

            System.out.println("P4");//Testing

            s.addVehicle(inputVehicle);

            System.out.println("P5");//Testing
        }

    }
    catch (FileNotFoundException fnfe)
    {
        System.out.println("File not found exception: " + fnfe.toString());
    }
    catch (IOException ioe)
    {
        System.out.println("I/O exception: " + ioe.toString());
    }

    System.out.println("addNewVehicleFromFile Complete");

}

不确定您是否需要它,但这是我的文件数据。

Vehicle Details

Fordtest =manufacturer
Focus =model
ioCheck =VIN
09/01/1989 =DateOfMan
d =TaxBand
19900 =Cost

Vehicle Details

Fordtest2 =manufacturer
Focus2 =model
ioCheckVIN2 =VIN
09/01/1989 =DateOfMan
a =TaxBand
1922 =Cost

最后,为了明确程序运行的位置,我在一些控制台输出中添加了测试。在错误发生之前,while 循环迭代两次输出 p1-p5,并且它永远不会到达最终的控制台输出,表明该方法已完成。

【问题讨论】:

  • 在调用任何方法之前,请确保 stringLine != null
  • BufferedReader.hasNextLine() 如果没有更多行要读取,则返回 false。在每个 br.readLine() 之前使用它

标签: java object io bufferedreader fileinputstream


【解决方案1】:

检查调用 readLine() 的结果是否不为空(空)。如果您检查并使其为空时不执行任何操作,这将解决您的问题!

【讨论】:

  • 该死的。被这件事难住了一段时间,这很明显。谢谢。
  • 如果我正确理解了您的代码,您可以在 while 循环中为 stringLine 分配缓冲读取器方法的值。而不是这个,在while循环之外(上面)分配这个:“stringLine = br.readLine(arguments here);” .... 然后执行“if (stringLine != null) { loop here or other code }”。我希望这很清楚并且适合您的需求。 :)
  • 由于某种原因,我无法将其分配到外部,因为它会导致循环出错。相反,我首先检查空值,然后检查“车辆详细信息”文本,这已修复它。添加空检查时遇到的问题是我再次调用它,因此向前移动,但现在它在 while 循环中对两个检查使用相同的调用。谢谢,现在一切都好。 :)
  • 抱歉,更彻底地阅读您的代码...我建议在第一次退出循环时调用缓冲阅读器,检查 while (stringLine.equalsIgnoreCase),然后在调用另一个缓冲阅读器while 循环结束。这应该有效,但似乎您已经修复了它! :)
【解决方案2】:

尝试检查 readLine() 是否为空。 while ((stringLine = br.readLine()) != null) { } 这将确保该行中有要读取的内容,否则它已到达文件末尾。

在您的代码中,每次迭代都有 3 次 readLine() 调用。如果由于某种原因更改了文本文件中的格式(例如缺少空行),这可能会导致问题。您最好将每辆车放在一条线上,用逗号分隔。例如:

Vehicle Details

Fordtest =manufacturer
Focus =model
ioCheck =VIN
09/01/1989 =DateOfMan
d =TaxBand
19900 =Cost

Vehicle Details

Fordtest2 =manufacturer
Focus2 =model
ioCheckVIN2 =VIN
09/01/1989 =DateOfMan
a =TaxBand
1922 =Cost

然后变成:

Fordtest, Focus, ioCheck, 09/01/1989, d, 19900
Fordtest2, Focus2, ioCheckVIN2, 09/01/1989, a, 1922

这将在一定程度上简化代码,并减少出错的机会。

同时确保在完成后关闭 FileInputStream。这可确保与它相关的任何资源都被正确释放。

try {
    FileInputStream fStream = new FileInputStream("AddVehicleFromFile.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(fStream));
    ...
} finally {
    try {
        if (fStream != null) {
            fStream.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

【讨论】:

  • 我第一次编写程序时确实有这个布局,但我玩弄了它,现在可以正常工作了。
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2016-01-08
  • 2019-01-30
  • 2023-04-07
相关资源
最近更新 更多