Java 使用JRE 1.7进行排序时,哪个类抛出IllegalArgumentException?
我在Java7中使用Collections.sort()遇到了(显然臭名昭著的)IllegalArgumentException 感谢SO,我理解了原因,这基本上是(咳嗽)糟糕的代码。Java 使用JRE 1.7进行排序时,哪个类抛出IllegalArgumentException?,java,sorting,java-7,illegalargumentexception,Java,Sorting,Java 7,Illegalargumentexception,我在Java7中使用Collections.sort()遇到了(显然臭名昭著的)IllegalArgumentException 感谢SO,我理解了原因,这基本上是(咳嗽)糟糕的代码。 问题是,我自己无法复制这个异常。我对jdk源代码进行了一些挖掘,找到了引发该异常的类。想法是创建相应的测试用例。 顺便说一下,这是代码 最重要的是,“lastUse”以微秒和毫秒为单位分配时间戳(是混合的),这提供了极好的int溢出溢出 实际问题是: 什么值会使此代码崩溃?以获得正确的测试用例 使用堆栈跟踪
问题是,我自己无法复制这个异常。我对jdk源代码进行了一些挖掘,找到了引发该异常的类。想法是创建相应的测试用例。
顺便说一下,这是代码
实际问题是:
什么值会使此代码崩溃?以获得正确的测试用例 使用堆栈跟踪更新:
at java.util.ComparableTimSort.mergeHi(Unknown Source)
at java.util.ComparableTimSort.mergeAt(Unknown Source)
at java.util.ComparableTimSort.mergeCollapse(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
不看stacktrace本身就很难说 但是报告提到方法本身可以抛出异常 (可选)如果实现检测到列表元素的自然顺序违反了可比合同 更新 看起来是因为您的对象没有满足一致性要求: 当且仅当e1.compareTo(e2)==0对于C类的每个e1和e2具有与e1.equals(e2)相同的布尔值时,C类的自然顺序称为与equals一致。请注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应抛出NullPointerException 从 区域:API:实用程序 简介:更新的数组和集合的排序行为可能引发IllegalArgumentException 说明:已替换
java.util.array.sort
和java.util.Collections.sort
使用的排序算法。如果新的排序实现检测到违反可比契约的可比文件,则可能抛出一个IllegalArgumentException
。以前的实现默默地忽略了这种情况。
如果需要以前的行为,可以使用新的系统属性java.util.Arrays.useLegacyMergeSort,来恢复以前的mergesort行为。
不相容性的性质:行为
传真:6804124
所以正确的实现应该是这样的
public int compareTo( Symbol other) {
if( this.lastUse == other.lastUse) {
return 0;
} else if( other.lastUse>this.lastUse) {
return 1;
}
return -1;
}
参考资料
看起来崩溃是由整数溢出引起的,但事实并非如此。 这被确定为bug,它也为您提供了详细介绍
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7075600
尝试将此作为临时修复:
Adding -Djava.util.Arrays.useLegacyMergeSort=true to my eclipse.ini does seem to have resolved the issue.
你可以在我发布的同一个链接中找到这个补丁
也请访问此
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6923200
,这是在第一个链接之前报告的同一种错误,但是由于他们无法重复创建相同的问题,因此它被关闭。Doh。。。使用堆栈跟踪进行更新,这意味着您需要实现与compareTo()一致的equals(),以完成合同?@monothreed:没错,请按照上述说明使您的compareTo
和equals
保持一致。我再次理解兼容性问题。谢谢。@Monothread为您的引用添加了正确的实现该bug与此相关“swing LayoutComparator破坏了可能导致IllegalArgumentException的传递性”@单线程:你还没有发布整个stacktrace?无法确定你的是否也与挥杆有关。
Adding -Djava.util.Arrays.useLegacyMergeSort=true to my eclipse.ini does seem to have resolved the issue.