Android Collection.sort 基于 Android API 版本不一致地崩溃



一个有趣的错误,基本上如果你的Android代码中有这行代码,它会在Android API 21上崩溃,但在API 28上工作

Collections.sort(Collections.singletonList(“1”));

java.lang.UnsupportedOperationException
at java.util.AbstractList.set(AbstractList.java:681)
at java.util.AbstractList$FullListIterator.set(AbstractList.java:143)
at java.util.Collections.sort(Collections.java:1869)
at com.davidcorrado.collectionssort.CollectionJavaUnitTest2.Collection_Sort_Immutable(CollectionJavaUnitTest2.java:16)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)

我理解为什么它会崩溃,因为它不允许 Collection.sort 中的不可变对象,但我真的不明白不一致。

我有这个代码示例:https://github.com/DavidCorrado/CollectionSortCrash/blob/master/app/src/androidTest/java/com/davidcorrado/collectionssort/CollectionJavaUnitTest2.java

因此,如果您运行上述针对 API 21 模拟器的测试,它会崩溃,但在 API 28 模拟器上它可以工作。 这也适用于真实设备。

所以我有两个问题

1(我不知道这些设备中的不同是什么导致这种情况。

2(有没有办法在机器人电动中得到这个错误。 我有一个成功的代码示例。

它适用于 API 28,因为排序的实现已被替换,并且新版本具有优化,如果list.size() <= 1,则只需跳过排序。

当排序被跳过时,它不会调用list.set(),因此永远不会触发不可变列表的UnsupportedOperationException

较旧的 API 级别没有这种优化。

最新更新