Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JRE 1.7进行排序时,哪个类抛出IllegalArgumentException?_Java_Sorting_Java 7_Illegalargumentexception - Fatal编程技术网

Java 使用JRE 1.7进行排序时,哪个类抛出IllegalArgumentException?

Java 使用JRE 1.7进行排序时,哪个类抛出IllegalArgumentException?,java,sorting,java-7,illegalargumentexception,Java,Sorting,Java 7,Illegalargumentexception,我在Java7中使用Collections.sort()遇到了(显然臭名昭著的)IllegalArgumentException 感谢SO,我理解了原因,这基本上是(咳嗽)糟糕的代码。 问题是,我自己无法复制这个异常。我对jdk源代码进行了一些挖掘,找到了引发该异常的类。想法是创建相应的测试用例。 顺便说一下,这是代码 最重要的是,“lastUse”以微秒和毫秒为单位分配时间戳(是混合的),这提供了极好的int溢出溢出 实际问题是: 什么值会使此代码崩溃?以获得正确的测试用例 使用堆栈跟踪

我在Java7中使用Collections.sort()遇到了(显然臭名昭著的)IllegalArgumentException 感谢SO,我理解了原因,这基本上是(咳嗽)糟糕的代码。
问题是,我自己无法复制这个异常。我对jdk源代码进行了一些挖掘,找到了引发该异常的类。想法是创建相应的测试用例。

顺便说一下,这是代码

最重要的是,“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)

不看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.