NoSuchMethodError: 没有接口方法 getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;在类 Lja
Posted
技术标签:
【中文标题】NoSuchMethodError: 没有接口方法 getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;在类 Ljava/util/Map 中;【英文标题】:NoSuchMethodError: No interface method getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; in class 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)
有人遇到过类似的事情吗?
【问题讨论】:
【参考方案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;
...
【讨论】:
以上是关于NoSuchMethodError: 没有接口方法 getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;在类 Lja的主要内容,如果未能解决你的问题,请参考以下文章
未处理的异常:NoSuchMethodError:类“RemoteMessage”没有实例方法“[]”
java.lang.NoSuchMethodError:没有虚拟方法 getParentFragmentManager()
java.lang.NoSuchMethodError:没有虚拟方法 setTokenProvider
Chrome CustomTab 错误:java.lang.NoSuchMethodError:没有静态方法 startActivity
NoSuchMethodError:类 '_InternalLinkedHashMap<String, dynamic>' 没有具有匹配参数的实例方法 'cast'
离子应用程序因 Braintree 插件而崩溃 - java.lang.NoSuchMethodError: 没有静态方法 getFont