我写了这个程序来比较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();
}
}
答案 0 :(得分:0)
你不应该这样做:
if (epgsRecordXMP.equals(null)) {
break;
}
如果你想知道epgsRecordXMP
是否为null,那么if应该是这样的:
if (epgsRecordXMP == null) {
break;
}
总结一下:当您尝试在equals
中调用epgsRecordXMP
方法时,您的应用会抛出NPE。