【问题标题】:java.lang.NoSuchMethodError: android.util.ArrayMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;java.lang.NoSuchMethodError: android.util.ArrayMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
【发布时间】:2023-05-10 14:06:02
【问题描述】:

我在进行 JUnit 测试时遇到了一个奇怪的错误。

我正在使用反射来调用我定义的方法: MyReflectUtil.callMethod(testManager, "loadPermission"); 在 testManager 中有一个 ArrayMap 的实例。 loadPermission 会在该实例上调用 get() 和 put()。

这是我定义的 ArrayMap:

public class ArrayMap<K, V> {
    HashMap<K, V> map = new HashMap<>();

    public void put(K key, V value) {
        map.put(key, value);
    }

    public V get(K key) {
        return map.get(key);
    }
}

在方法 loadPermission 中,我可以调用 get() 方法,但是当我调用 put() 时,我得到了错误:

java.lang.NoSuchMethodError: android.util.ArrayMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

这是什么Ljava/lang/Object? 当我记录 myArrayMapInstance.getClass().getDeclaredMethods() 时,我得到:

public java.lang.Object android.util.ArrayMap.get(java.lang.Object), public void android.util.ArrayMap.put(java.lang.Object,java.lang.Object)

java.lang.Object 前面没有字母 L。但是我无法解释为什么我可以调用 get(),因为它与 put() 本质上是一样的。

有人可以帮忙吗?真的很感激!

【问题讨论】:

  • 关于您的问题,“这是什么 Ljava/lang/Object?”,请参阅 this thread
  • 这个类对我来说一点意义都没有,你为什么要把它命名为ArrayMap&lt;K, V&gt;?你甚至不能定义一个构造函数而不会在&gt; 上出现编译错误?据我所知,类名不能有空格?
  • @yur,这是 Java 中的泛型。您可以查看 java.util.List 在 java 中的定义作为示例。 :)

标签: java android


【解决方案1】:

右括号后的Ljava/lang/Object; 是预期方法的返回类型:

java.lang.NoSuchMethodError: android.util.ArrayMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

您的调用需要一个返回某些内容的方法,但在您的 ArrayMap 代码中,此 put 方法是 void

【讨论】:

  • 非常感谢!我为 put() 添加了返回值,现在它工作得很好!