由于EOF而在do / while循环中的NPE ...提前捕获EOF以避免NPE

时间:2017-07-19 22:45:15

标签: java nullpointerexception filereader

我写了这个程序来比较2个文件。它们的尺寸为500mb到2.8gb,每6小时创建一次。我有来自2个来源(NMD和XMP)的2个文件。它们被分解为具有由管道(|)字符分隔的字段的文本行。每行是一条记录,最长可达65,000个字符。数据与电视节目和电影有关,显示时间和描述性内容。我已经确定任何特定节目或电影至少有3个数据可以唯一地标识该节目或电影。 IE:CallSign,ProgramId和StartLong。这个数据的两个来源是称为NMD和XMP的系统,因此该缩写词添加到各种变量中。所以我的目标是比较NMD创建的文件和XMP创建的文件,并确认NMD生成的所有内容也是由XMP生成的,并且每个匹配记录中的数据是相同的。

我在这里要完成的是:1。按记录读取3个唯一数据字段的NMD文件记录。 2.按记录读取XMP文件记录,并查找NMD文件中当前记录的匹配项。 3. NMD文件应该一次迭代一条记录。然后应在整个XMD文件中搜索每个NMD记录,记录该记录的相同记录。 4.在2个文件中的一个中写入一个日志条目,指示成功或失败以及该数据是什么。

当我到达testdataXMP.txt文件的末尾时,我遇到了NPE问题。我假设testdataNMD.txt会发生同样的事情。我试图在readLine之后立即退出循环,因为epgsRecordNMD或epgsRecordXMP刚刚到达文件的末尾,如果它在文件中的那一点。最初的NPE用于尝试在文件末尾对空数据进行字符串拆分。现在我根据调试器在这里获得NPE。

                    if (epgsRecordXMP.equals(null)) {
                        break;
                    }

我这样做错了吗?如果我真的在文件的末尾,那么readLine应该返回null吗?

我也是这样做的,但是根据我有限的经验,他们觉得他们实际上是一样的。它也扔了一个NPE。

if(epgsRecordXMP.equals(null))break;

这是代码......

public static void main(String[] args) throws java.io.IOException {

    String epgsRecordNMD = null;
    String epgsRecordXMP = null;
    BufferedWriter logSuccessWriter = null;
    BufferedWriter logFailureWriter = null;
    BufferedReader readXMP = null;
    BufferedReader readNMD = null;
    int successCount = 0;


    readNMD = new BufferedReader(new FileReader("d:testdataNMD.txt"));
    readXMP = new BufferedReader(new FileReader("d:testdataXMP.txt"));

    do {

            epgsRecordNMD = readNMD.readLine();
            if (epgsRecordNMD.equals(null)) {
                break;
            }
            String[] epgsSplitNMD = epgsRecordNMD.split("\\|");
            String epgsCallSignNMD = epgsSplitNMD[0];
            String epgsProgramIdNMD = epgsSplitNMD[2];
            String epgsStartLongNMD = epgsSplitNMD[9];
            System.out.println("epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD );


            do {


                    epgsRecordXMP = readXMP.readLine();
                    if (epgsRecordXMP.equals(null)) {
                        break;
                    }
                    String[] epgsSplitXMP = epgsRecordXMP.split("\\|");
                    String epgsCallSignXMP = epgsSplitXMP[0];
                    String epgsProgramIdXMP = epgsSplitXMP[2];
                    String epgsStartLongXMP = epgsSplitXMP[9];
                    System.out.println("epgsCallsignXMP: " + epgsCallSignXMP + " epgsProgramIdXMP: " + epgsProgramIdXMP + " epgsStartLongXMP: " + epgsStartLongXMP);


                    if (epgsCallSignXMP.equals(epgsCallSignNMD) && epgsProgramIdXMP.equals(epgsProgramIdNMD) && epgsStartLongXMP.equals(epgsStartLongNMD)) {
                        logSuccessWriter = new BufferedWriter (new FileWriter("d:success.log", true));
                        logSuccessWriter.write("NMD match found in XMP " + "epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD);
                        logSuccessWriter.write("\n");
                        successCount++;
                        logSuccessWriter.write("Successful matches: " + successCount);
                        logSuccessWriter.write("\n");
                        logSuccessWriter.close();
                        System.out.println ("Match found");
                        System.out.println ("Successful matches: " + successCount);

                    }

                } while (epgsRecordXMP != null); 

                readXMP.close();

                if (successCount == 0) {
                    logFailureWriter = new BufferedWriter (new FileWriter("d:failure.log", true));
                    logFailureWriter.write("NMD match not found in XMP" + "epgsCallsignNMD: " + epgsCallSignNMD + " epgsProgramIdNMD: " + epgsProgramIdNMD + " epgsStartLongNMD: " + epgsStartLongNMD);
                    logFailureWriter.write("\n");
                    logFailureWriter.close();
                    System.out.println ("Match NOT found");
                }

       } while (epgsRecordNMD != null);
        readNMD.close();

    }
}

1 个答案:

答案 0 :(得分:0)

你不应该这样做:

if (epgsRecordXMP.equals(null)) {
    break;
}

如果你想知道epgsRecordXMP是否为null,那么if应该是这样的:

if (epgsRecordXMP == null) {
    break;
}

总结一下:当您尝试在equals中调用epgsRecordXMP方法时,您的应用会抛出NPE。