这个比较器如何不遵循其总合同?

时间:2015-10-01 06:45:22

标签: java exception comparator

[已修复问题,请参见底部编辑]

我之前使用过的这种方法现在因为不遵守它的一般合同而抛出异常。

private Face[] sortByDistance(Face[] faces, final Point3D p) {
    final Comparator<Face> faceComparator = new Comparator<Face>() {
        @Override
        public int compare(Face o1, Face o2) {
            return MathUtils.distance(o2.getAveragePoint(), p) - MathUtils.distance(o1.getAveragePoint(), p);
        }
    };
    Arrays.sort(faces, faceComparator); // Exception occurs here.
    return faces;
}

我肯定知道参数中的Point3D是导致它有时抛出此异常的原因。虽然只有某些点导致这种情况,但有些可行。为什么呢?

以下是一些导致异常的示例点:

(2.9081598E-6,-38.519745,18.787334)
(-15.432643,38.19713,11.813029)
(-20.884119,28.744518,-23.96541)
(5.961947,16.380322,-39.151947)
(3.7570944,3.6281846,-42.537693)
(-20.747366,9.237327,-36.34492)
(-17.694483,20.355177,-33.30626)
(-5.3533697,30.360487,-29.771076)
(14.785507,34.832466,-20.12021)

如果它有帮助,我只是在将它放入一个扩展Thread并自行运行的对象之后才注意到这一点,并不断循环一系列方法,其中一个方法调用上述方法,但有异常。直到现在它还没有这样做,所以如果可能有一些并发的原因,我会期待它。

[编辑]问题是Point3D&#34; p&#34;在参数中是一个可变对象,而另一个线程上的对象正在对它进行更改。

0 个答案:

没有答案