gpt4 book ai didi

java - Android Collection.sort 根据 Android API 版本不一致地崩溃

转载 作者:行者123 更新时间:2023-12-02 09:41:59 25 4
gpt4 key购买 nike

一个有趣的错误,本质上,如果您的 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 中的不可变对象(immutable对象),但我真的不明白这种不一致。

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

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

所以我有两个问题

1)这些设备中有哪些我不知道的不同原因导致了这种情况。

2)有没有办法在机器人电气中出现此错误。我有一个成功的代码示例。

最佳答案

它适用于 API 28,因为排序的实现已被替换,并且新版本进行了优化,只需跳过排序 if list.size() <= 1 .

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

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

关于java - Android Collection.sort 根据 Android API 版本不一致地崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com