由于空指针异常,我的程序崩溃了。
堆栈跟踪剪辑:
java.lang.NullPointerException
at com.my.GRTRecTimeSortComparator.compare(SourceFile:15)
那很好也很好。但我的问题是第15行是类声明:
15 public class GRTRecTimeSortComparator implements Comparator<GRTRecord> {
16 @Override
17 public int compare(GRTRecord rec1, GRTRecord rec2) {
18
19 int returnVal=rec1.getRecordCalendar().compareTo(rec2.getRecordCalendar());
20 return returnVal;
21 }
22}
它正在调用Compare函数,但我也没有看到它的问题。每条记录都分配了一个独特的日历。
有什么想法吗?我在这做错了什么?
编辑:回应查询:
不,除了我写的这个事实之外,这个类本身并没有什么奇怪的。
我使用的是Proguard。也许混淆是错误地取代了什么?
我正在为这些记录编写测试。他们不应该null
,Calendars
也不应该ArrayList
;我之前使用它们,并取得了良好的效果。
也许我只是错误地传递了{{1}}。
编辑2:
插入到类中的记录行永远不会运行。 无论我对类添加什么或做什么,空指针总是解析为类声明行。
删除了Proguard混淆,但仍然没有骰子。
我真的很沮丧。
编辑3:
对于未来用户:
Proguard破坏你的堆栈痕迹。这就是上述原因。如果遇到问题,请删除proguard。
CAUSE实际上是数据集中的损坏记录。
答案 0 :(得分:1)
在这些时候,将调试器设置为中断错误是很好的。您将确切知道您的NPE在哪里。
答案 1 :(得分:1)
我强烈怀疑调试信息不同步。将登录信息放入compare
方法。我会记录(按顺序):
rec1
rec2
rec1.getRecordCalendar()
rec2.getRecordCalendar()
如果这不是问题,那么以任何其他方式对该课程有什么“奇怪”吗?例如:
答案 2 :(得分:1)
您可能想要尝试检查null rec1和rec2以获得完整性
答案 3 :(得分:0)
如果您正在实施比较器接口,那么您只能使用compare()
方法,但是您尝试访问未实现的可比较的compareTo()
方法。
在你的计划中:
比较值以参考形式返回,无法返回基本类型。
答案 4 :(得分:0)
ProGuard尝试尽可能保留调试信息,但这在技术上并不总是可行的。例如,如果方法getRecordCalendar被内联,那么方法抛出的任何异常现在都会从调用站点抛出。