2010-06-06 2 views
3

컴파일하는 매우 간단한 프로젝트가 있지만 에뮬레이터에서 시작할 수 없습니다. 주석이주석이 달린 인수가있는 개인 메소드의 경우 java.lang.VerifyError

private void bar(String a) {} // OK 

를 제거하거나 방법 가시성이 변경되었을 경우

private void bar(@Some String a) {} // java.lang.VerifyError 

이 문제는 피할 수 있습니다 : 문제는이 방법입니다

void bar(@Some String a) {} // OK 
public void bar(@Some String a) {} // OK 
protected void bar(@Some String a) {} // OK 

원래의 방법으로 잘못 어떤 생각 ? 이것이 달비 크 버그입니까?

어떤 하나의 코드로 실험하고자 whould 경우는 여기있다 :

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(); 
    } 
} 

S 압정 추적 :

ERROR/dalvikvm(1358): Could not find method com.my.Test.bar, referenced from method com.my.Test.foo 
WARN/dalvikvm(1358): VFY: unable to resolve direct method 11: Lcom/my/Test;.bar (Ljava/lang/String;)V 
WARN/dalvikvm(1358): VFY: rejecting opcode 0x70 at 0x0001 
WARN/dalvikvm(1358): VFY: rejected Lcom/my/Test;.foo()V 
WARN/dalvikvm(1358): Verifier rejected class Lcom/my/Test; 
DEBUG/AndroidRuntime(1358): Shutting down VM 
WARN/dalvikvm(1358): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) 
ERROR/AndroidRuntime(1358): Uncaught handler: thread main exiting due to uncaught exception 
ERROR/AndroidRuntime(1358): java.lang.VerifyError: com.my.Test 
ERROR/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.access$1800(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) 

답변

0

내 생각 엔 "개인 무효 바 (문자열) {}"컴파일러에 의해 완벽하게하면 인라인 표시 실제로 생성되지 않습니다 것입니다. 그렇다면 foo()에서 참조가 왜 발생하는지 (인라인)는 말하기 어렵지만 주석은 컴파일러의 부기를 망칠 가능성이 큽니다.

은 (여기에 단서는 "개인"입니다 - 개인 방법은 거의 항상 인라인 좋은 후보, 무효 기관과 특히 그들이다.)

3

이 실제로 변경 이클립스 3.5 컴파일러 (Bug 289576)의 버그 private 메서드가 주석 첨부 된 메소드의 수식어가되어, 메소드가 「패키지 전용」이되도록 (듯이)합니다. 그래서 다음 을 .class 파일

private void bar(@Some String a) {…} 

가된다 :

void bar(@Some String a) {…} 

그러나 여전히위한도 (만 개인 메소드 호출을위한 것입니다 invokespecial JVM 명령에 의해 호출 변경된 방법 일부 다른 비 - 메소드 물건), 놀랍게도 또한 "패키지 개인"방법에 대한 Sun/Oracle JVM을 작동합니다. 안드로이드 된 .class => 덱스 번역 중
invokespecial JVM 명령은 개인 및 생성자 메소드를 호출 할 호출 다이렉트 달빅 명령어로 변환된다. bar() 메소드가 패키지가 표시되는 메소드가 되었기 때문에 invoke-direct은 찾을 수 없으므로 NoSuchMethodError을 던집니다.

해결 방법은 Eclipse 3.6 이상 또는 javac 컴파일러 (build.xml ant 스크립트 사용)를 사용하는 것입니다.

+0

이 또한 Android Studio에서도 발생하는 것으로 나타났습니다. 그러나 아무런 주석이 없었다.액세스 수정자를 개인에서 공개로 변경했으며 매력처럼 작동합니다. 매우 이상합니다. –

관련 문제