我在 Java7 中使用 Collections.sort() 遇到了(显然是臭名昭著的)IllegalArgumentException
多亏了所以我理解了原因,这基本上是(咳嗽)糟糕的代码。
问题是,我自己无法重现异常。我做了一些jdk源代码挖掘,并找到了哪个类抛出了那个异常。这个想法是创建相应的测试用例。
这里是代码,顺便说一下
<pride level="0" >
@Override
public int compareTo( Symbol other) {
if( this.lastUse == 0) {
if( other.lastUse != 0) return (int)( -DateMicros.ONE_DAY);
} else if( other.lastUse == 0) {
return ( int)DateMicros.ONE_DAY;
}
return ( int)( this.lastUse - other.lastUse);
}
</pride > 最重要的是,“lastUse”以微秒和毫秒(是混合的)为单位分配时间戳,这给出了极好的 int 溢出溢出
实际问题是:
什么值会导致此代码崩溃?得到一个适当的测试用例。
使用堆栈跟踪更新:
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)