你怎么解释“java.lang.NoSuchMethodError:没有直接方法”?

时间:2015-08-17 00:27:08

标签: java android

我们或许天真地决定,我们应该将我们的许多库从两年前的1.12.0-betas更新到漂亮的新版本1.20.0。例如:我们将google-http-client-1.12.0-beta.jar更新为google-http-client-android-1.20.0.jar。

执行此代码时:

  List<String> scopes = Lists.newArrayList(SendToGoogleUtils.FUSION_TABLES_SCOPE);
  GoogleAccountCredential credential = SendToGoogleUtils.getGoogleAccountCredential(
      context, account.name, scopes );
  if (credential == null) {
    return false;
  }
  Fusiontables fusiontables = new Fusiontables.Builder(
      AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build();

我们收到了这个惊人的错误报告:

FATAL EXCEPTION Caused by: java.lang.NoSuchMethodError: No direct method <init>(Lcom/google/api/client/http/HttpTransport;Lcom/google/api/client/http/HttpRequestInitializer;Ljava/lang/String;Ljava/lang/String;Lcom/google/api/client/json/JsonObjectParser;Lcom/google/api/client/googleapis/services/GoogleClientRequestInitializer;Ljava/lang/String;Z)V in class Lcom/google/api/client/googleapis/services/json/AbstractGoogleJsonClient; or its super classes (declaration of 'com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient' appears in /data/app/dkr.ajijic.apps.tm-1/base.apk)

有人知道怎么解读吗?我们当然不会!

3 个答案:

答案 0 :(得分:4)

这只是意味着具有特定参数列表的AbstractGoogleJsonClient的构造函数不可用。

检查super()AbstractGoogleJsonClient子类的调用,并确保无需更新参数列表以匹配更新的库。

如果您的源代码中没有,那么Google API客户端库可能存在库版本依赖性问题。

答案 1 :(得分:0)

发生此问题是因为通过Proguard应用了Proguard,此类名称和方法名称发生了更改,从而导致了NoSuchMethod异常的发生。

要解决此错误,请在您的Proguard规则中添加以下行。

  

-保留com.google类。** {*; }

希望这可以解决您的问题。

答案 2 :(得分:0)

当源代码目标版本高于设备上使用的操作系统版本时,在 Android 上有此问题。 因此可以访问与操作系统捆绑在一起的库中不存在的方法,因此 NoSuchMethodError