类声明会导致空指针异常

时间:2012-03-27 16:26:02

标签: java calendar nullpointerexception proguard

由于空指针异常,我的程序崩溃了。

堆栈跟踪剪辑:

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。也许混淆是错误地取代了什么?

我正在为这些记录编写测试。他们不应该nullCalendars也不应该ArrayList;我之前使用它们,并取得了良好的效果。

也许我只是错误地传递了{{1}}。

编辑2:

插入到类中的记录行永远不会运行。 无论我对类添加什么或做什么,空指针总是解析为类声明行。

删除了Proguard混淆,但仍然没有骰子。

我真的很沮丧。

编辑3:

对于未来用户:

Proguard破坏你的堆栈痕迹。这就是上述原因。如果遇到问题,请删除proguard。

CAUSE实际上是数据集中的损坏记录。

5 个答案:

答案 0 :(得分:1)

在这些时候,将调试器设置为中断错误是很好的。您将确切知道您的NPE在哪里。

答案 1 :(得分:1)

我强烈怀疑调试信息不​​同步。将登录信息放入compare方法。我会记录(按顺序):

  • rec1
  • rec2
  • rec1.getRecordCalendar()
  • rec2.getRecordCalendar()

如果这不是问题,那么以任何其他方式对该课程有什么“奇怪”吗?例如:

  • 您使用的是Hibernate还是其他可能为您创建代理的东西?
  • 这是一个内部阶级吗?

答案 2 :(得分:1)

您可能想要尝试检查null rec1和rec2以获得完整性

答案 3 :(得分:0)

如果您正在实施比较器接口,那么您只能使用compare()方法,但是您尝试访问未实现的可比较的compareTo()方法。 在你的计划中:

比较值以参考形式返回,无法返回基本类型。

答案 4 :(得分:0)

ProGuard尝试尽可能保留调试信息,但这在技术上并不总是可行的。例如,如果方法getRecordCalendar被内联,那么方法抛出的任何异常现在都会从调用站点抛出。