2012-03-27 120 views
0

由于空指针异常导致我的程序崩溃。堆栈跟踪的类声明导致空指针异常

剪断:

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} 

它呼唤出来的功能比较全,但我不觉得这有是问题。每条记录都有一个唯一的日历分配给它。

任何想法?我在这里做错了什么?

编辑:在响应查询:

没有,没有什么奇怪的类本身,除了我写的事实。

我正在使用Proguard。也许混淆是不正确的取代东西?

我正在为记录编写测试。他们不应该是null,也不应该Calendars;我之前立即使用它们,并取得良好效果。

也许我只是错误地通过了ArrayList

编辑2:

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

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

我真的很沮丧。

编辑3:

对于未来用户:

Proguard的废墟您的堆栈跟踪。这是上述的原因。如果遇到问题,请移除proguard。

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

+4

很可能,您正在阅读的源代码与编译代码中的堆栈跟踪不同步。尝试从干净的建筑,然后重新运行。 – 2012-03-27 16:27:18

回答

1

我强烈怀疑调试信息刚刚失去同步。把日志记录到你的compare方法中。我登录(按顺序):

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

如果这不是问题,有什么 “奇” 关于类以任何其他方式?例如:

  • 您是否使用Hibernate或类似的可能为您创建代理的东西?
  • 这是一个内部类吗?
+0

没有休眠。除了使用Proguard之外,我不认为有什么不正常的。这些都在NetBeans平台应用程序中,发生在SwingWorkers之一中。 – Sheriff 2012-03-27 18:43:16

+0

@Sheriff:你有没有把我建议的日志记录下来?尽管如此,如果Proguard与堆栈轨迹相混淆,我不会感到惊讶。 – 2012-03-27 18:45:49

+0

我放入了日志。但它从来没有运行过。我禁用了Proguard,并将堆栈跟踪失败转换为“Compare”函数,正如人们所期望的那样。重新启用日志记录以查看现在发生的事情。 – Sheriff 2012-03-27 19:00:16

1

有时像这些,它很好设置您的调试器打破了错误。你会确切知道你的NPE在哪里。

+0

我想这是我学习如何真正使用调试器的时候了。 – Sheriff 2012-03-27 18:53:08

1

你可能想尝试检查一个空REC1和REC2的完整性

+0

无都是空的。 'ArrayList'包含127996条记录,所有记录都具有良好的'Calendar'对象。 – Sheriff 2012-03-27 18:43:57

0

如果要实现比较的接口,那么你只能使用compare()方法,但您尝试访问compareTo()方法的可比你没不实施。 在您的程序中:

比较值以参考形式返回,无法返回到原始类型。

0

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