【问题标题】:NoSuchMethodError: No interface method getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; in class Ljava/util/Map;NoSuchMethodError: 没有接口方法 getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;在类 Ljava/util/Map 中;
【发布时间】:2020-02-12 23:17:31
【问题描述】:

我在运行 Android 5.0 的魅族设备上遇到了崩溃。大多数设备上都不会出现这种崩溃。

错误是:java.lang.NoSuchMethodError: No interface method getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; in class Ljava/util/Map; or its super classes (declaration of 'java.util.Map' appears in /system/framework/core-libart.jar)

有人遇到过类似的事情吗?

【问题讨论】:

    标签: android kotlin android-databinding android-livedata


    【解决方案1】:

    API 级别 24 中添加了 getOrDefault 方法,API 级别 24 以下的运行时没有该方法。这就是它在 Android API 级别 21 中不起作用的原因。

    【讨论】:

    • 有没有办法在编译时生成警告或任何 lint 规则来检测这些方法的使用情况?
    • 那该怎么办?这里有什么建议吗?
    【解决方案2】:

    尤其是这个功能你可以这样做:

    //ask your app running more modern API as level 24 (Build.VERSION_CODES.N(ougat))
    result = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) ?          
        map.getOrDefault(value, default) :
        // if not, then need to solve with similar code of original code in next below
        ((map.get(value) != null) ? map.get(value) : default);    
    

    原文中有源代码 c:\Users\Your_username\AppData\Local\Android\Sdk\sources\android-29\java\util\Map.java:

        ...
        default V getOrDefault(Object key, V defaultValue) {
            V v;
            return (((v = get(key)) != null) || containsKey(key))
                ? v
                : defaultValue;
        }
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2014-12-26
      • 1970-01-01
      相关资源
      最近更新 更多