Dan*_*bes 1 java comparator illegalargumentexception java-7
作为实习的一部分,我被要求调查一个错误.一段代码正在抛出
java.lang.IllegalArgumentException:比较方法违反了它的一般合同!
自定义Comparator是通过查看long所述自定义类的成员变量来比较两个自定义类:
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
equals此自定义类的方法查看此自定义类的String成员变量.我们有一段时间重现这种行为.我下意识的反应是代替return语句在自定义Comparator与return v2.compareTo(v1);范围,但我们是持怀疑态度,这将解决这个问题.有人可以提供任何见解吗?
Arrays.sort(anArray, new Comparator<ACustomClass>() {
@Override
public int compare(ACustomClass o1, ACustomClass o2) {
long v1 = o1.getALong();
long v2 = o2.getALong();
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
}});
Run Code Online (Sandbox Code Playgroud)
我看不出比较器出现的明显错误.(而且我对提议的修正案持怀疑态度:他们"嗅到"伏都教编程对我来说.)
但是如果ACustomClass类的aLong属性是可变的...... 并且在排序时它发生了变化 ......那么这可能会导致排序代码认为比较器违反了合同.
所以...检查这是否是一个并发问题,其中一个线程正在改变另一个线程试图排序的数组中的对象.
我们花了很多时间在这个调试器上......很多不同的测试用例.无法获得要复制的行为.
我认为这是指出并发问题的证据......
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |