我有这段代码:
GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
String msg = getString(R.string.common_google_play_services_update_text);
Log.e(TAG, msg);
Dialog errDlg = googleAPI.getErrorDialog(MyActivity.this, result, 1111, listener);
运行时,字符串common_google_play_services_update_text
被正确写入LogCat
,但getErrorDialog()
会抛出此异常:
java.lang.NoSuchFieldError:没有静态字段 类中我的common_google_play_services_update_text类型 LCOM /谷歌/安卓/ GMS / R $串;或其超类(声明 'com.google.android.gms.R $ string'出现在 /data/app/com.mygame-1/base.apk)
我该如何解决这个问题?
答案 0 :(得分:0)
错误NoSuchFieldError
表示该类没有指定名称的字段。如果应用程序尝试访问或修改对象的指定字段,并且该对象不再具有该字段,则抛出此异常。通常,编译器会捕获此错误,并且只有在类的定义发生不兼容更改时才能在运行时发生此错误。
此外,您可能已经获得了引用重新编译的类文件中不再存在的字段的旧代码。您可以查看here。
解决方案是清除所有类文件并从新的编译所有内容。
更新:如果在重新编译所有内容后仍然遇到相同的错误,那么您可能正在编译一个版本的外部库并在运行时使用另一个版本。
您现在需要做的是首先确定导致问题的类(看起来您已经这样做了),然后使用
-verbose:class
命令行选项运行您的应用程序。它会将大量的类加载信息转储到您的标准中,并且您将能够找到有问题的类的确切加载位置。
希望这有帮助!