我有一个非常简单的项目可以编译,但是无法在Emulator上启动.问题在于这种方法:
private voID bar(@Some String a) {} // java.lang.VerifyError
如果删除注释,可以避免该问题
private voID bar(String a) {} // OK
或方法可见性已更改:
voID bar(@Some String a) {} // OKpublic voID bar(@Some String a) {} // OKprotected voID bar(@Some String a) {} // OK
知道原始方法有什么问题吗?这是达尔维克虫吗?
如果有人想尝试代码,这里是:
Test.java:
public class Test { private voID bar(@Some String a) {} public voID foo() { bar(null); }}
Some.java:
public @interface Some {}
MainActivity.java:
public class MainActivity extends Activity { @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); new test().foo(); }}
堆栈跟踪:
ERROR/dalvikvm(1358): Could not find method com.my.Test.bar,referenced from method com.my.Test.fooWARN/dalvikvm(1358): VFY: unable to resolve direct method 11: Lcom/my/Test;.bar (Ljava/lang/String;)VWARN/dalvikvm(1358): VFY: rejecting opcode 0x70 at 0x0001WARN/dalvikvm(1358): VFY: rejected Lcom/my/Test;.foo ()VWARN/dalvikvm(1358): VerifIEr rejected class Lcom/my/Test;DEBUG/AndroIDRuntime(1358): Shutting down VMWARN/dalvikvm(1358): threadID=3: thread exiting with uncaught exception (group=0x4000fe70)ERROR/AndroIDRuntime(1358): Uncaught handler: thread main exiting due to uncaught exceptionERROR/AndroIDRuntime(1358): java.lang.VerifyError: com.my.TestERROR/AndroIDRuntime(1358): at com.my.MainActivity.onCreate(MainActivity.java:13)ERROR/AndroIDRuntime(1358): at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)ERROR/AndroIDRuntime(1358): at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2231)ERROR/AndroIDRuntime(1358): at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)ERROR/AndroIDRuntime(1358): at androID.app.ActivityThread.access00(ActivityThread.java:112)ERROR/AndroIDRuntime(1358): at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)ERROR/AndroIDRuntime(1358): at androID.os.Handler.dispatchMessage(Handler.java:99)ERROR/AndroIDRuntime(1358): at androID.os.Looper.loop(Looper.java:123)ERROR/AndroIDRuntime(1358): at androID.app.ActivityThread.main(ActivityThread.java:3948)ERROR/AndroIDRuntime(1358): at java.lang.reflect.Method.invokeNative(Native Method)ERROR/AndroIDRuntime(1358): at java.lang.reflect.Method.invoke(Method.java:521)ERROR/AndroIDRuntime(1358): at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)ERROR/AndroIDRuntime(1358): at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:540)ERROR/AndroIDRuntime(1358): at dalvik.system.NativeStart.main(Native Method)
最佳答案这实际上是Eclipse 3.5编译器(Bug 289576)的一个错误,该错误使用带注释的参数更改了方法的private修饰符,从而使该方法成为“ package-private”.因此,您的:private voID bar(@Some String a) {…}
.class文件中的内容变为:
voID bar(@Some String a) {…}
但是,更改后的方法仍由invokespecial JVM指令调用,该指令仅用于私有方法调用(也用于某些其他非方法方面的东西),但是令人惊讶的是,它也适用于Sun / Oracle JVM上的“程序包私有”方法.
在AndroID期间.class => .dex转换invokespecial JVM指令被转换为直接调用Dalvik指令,该指令只能调用私有方法和构造函数.由于bar()方法已成为程序包可见的方法,invoke-direct找不到它,并引发NoSuchMethodError.
解决方案是使用Eclipse 3.6或javac编译器(通过build.xml ant脚本).
总结以上是内存溢出为你收集整理的带有注释参数的私有方法的Android java.lang.VerifyError 全部内容,希望文章能够帮你解决带有注释参数的私有方法的Android java.lang.VerifyError 所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)