Java 类声明导致空指针异常

Java 类声明导致空指针异常,java,calendar,nullpointerexception,proguard,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

我的程序因空指针异常而崩溃

堆栈跟踪的剪切:

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}
15公共类GRTRectimestorComparator实现Comparator{
16@Override
17公共整数比较(GRTRecord rec1、GRTRecord rec2){
18
19 int returnVal=rec1.getRecordCalendar().compareTo(rec2.getRecordCalendar());
20返回值;
21    }
22}
它调用了Compare函数,但我也不认为这有什么问题。每个记录都有一个唯一的日历分配给它

有什么想法吗?我做错了什么

编辑:响应查询:

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

我正在使用Proguard。也许是混淆错误地替换了东西

我现在正在写测试记录。它们不应为空,日历也不应为空;我使用它们之前,立即,并获得良好的效果

也许我只是错误地传递了
ArrayList

编辑2:

插入到类中的日志行永远不会运行。 无论我向类添加什么或执行什么操作,空指针始终解析为类声明行

移除了Proguard模糊,仍然没有骰子

我真的很沮丧

编辑3:

对于未来用户:

Proguard会破坏堆栈跟踪。这就是造成上述情况的原因。如果遇到问题,请删除proguard


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

在这种情况下,最好将调试器设置为出错时中断。您将确切地知道NPE的位置。

在这种情况下,最好将调试器设置为出错时中断。您将确切地知道您的NPE在哪里。

我强烈怀疑调试信息只是不同步。将日志记录放入您的
compare
方法中。我将(按顺序)记录:

  • rec1
  • rec2
  • rec1.getRecordCalendar()
  • rec2.getRecordCalendar()
如果这不是问题所在,那么这门课在其他方面有什么“奇怪”的地方吗?例如:

  • 您是否正在使用Hibernate或类似的工具为您创建代理
  • 这是一个内部类吗

我强烈怀疑调试信息不同步。将日志记录放入您的
compare
方法中。我将(按顺序)记录:

  • rec1
  • rec2
  • rec1.getRecordCalendar()
  • rec2.getRecordCalendar()
如果这不是问题所在,那么这门课在其他方面有什么“奇怪”的地方吗?例如:

  • 您是否正在使用Hibernate或类似的工具为您创建代理
  • 这是一个内部类吗

您可能希望尝试检查null rec1和rec2的完整性

您可能希望尝试检查null rec1和rec2的完整性

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


比较值以引用形式返回,无法返回到基元类型。

如果您正在实现comparator接口,则只能使用
compare()
方法,但您正在尝试访问未实现的comparable的
compareTo()
方法。 在您的程序中:


比较值以引用形式返回,不能返回到基元类型。

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

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

最有可能的情况是,您读取的源代码与编译代码中的堆栈跟踪不同步。尝试从clean构建,然后重新运行。最可能的情况是,您正在读取的源代码与编译代码中的堆栈跟踪不同步。请尝试从“干净”构建,然后重新运行。无休眠。除了使用Proguard,我不相信有任何异常。这一切都在一个Netbeans Paltform应用程序中,发生在一个Swingworker中。@Sheriff:你有没有加入我建议的日志记录?如果Proguard弄乱了堆栈跟踪,我一点也不会感到惊讶。我把日志记录放进去了。但它从未运行过。我禁用了Proguard,这将堆栈跟踪故障转移到
Compare
函数,正如人们所期望的那样。重新启用日志记录以查看现在发生的情况。这次日志记录工作正常。它们都有分配给它们的值。因为CompareTo函数是一个固有的日历函数,所以我认为它应该可以工作。但是我还要玩一些。@Sheriff:即使在日志记录之后,异常仍然被抛出吗?没有休眠。除了使用Proguard,我不相信有任何异常。这一切都在一个Netbeans Paltform应用程序中,发生在一个Swingworker中。@Sheriff:你有没有加入我建议的日志记录?如果Proguard弄乱了堆栈跟踪,我一点也不会感到惊讶。我把日志记录放进去了。但它从未运行过。我禁用了Proguard,这将堆栈跟踪故障转移到
Compare
函数,正如人们所期望的那样。重新启用日志记录以查看现在发生的情况。日志记录工作正常