实例化片段时的java.lang.VerifyError

时间:2015-12-19 12:22:25

标签: java android android-fragments verifyerror

在早于Lollipop的Android版本中,我在尝试实例化片段时不断收到VerifyError,导致应用程序崩溃。有人可以向我解释这个错误的原因吗?

12-19 17:46:52.510  28238-28238/com.greeblu.tootl2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.greeblu.tootl2, PID: 28238
java.lang.VerifyError: com/greeblu/tootl2/fragment/ProfileGridFragment
        at com.greeblu.tootl2.activity.ProfileActivity.launchGridFragment(ProfileActivity.java:289)
        at com.greeblu.tootl2.fragment.ProfileOverlayFragment$3.onClick(ProfileOverlayFragment.java:123)
        at android.view.View.performClick(View.java:4438)
        at android.view.View$PerformClick.run(View.java:18439)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5034)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
        at dalvik.system.NativeStart.main(Native Method)

这就是我为较旧的Android版本调用片段的方式:

FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.profileContainer, new ProfileGridFragment(),fragmentTag); //Replaces the Fragment C previously in the right_container with a new Fragment B
        ft.commit();

修改 onClick调用的代码如下。它是从同一活动中的另一个片段调用的

picContainer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ((ProfileActivity) getActivity()).launchGridFragment(overlayDp, "all");
        }
    });

2 个答案:

答案 0 :(得分:0)

我遇到了这个确切的错误,因为我有一个try-catch块,其异常类在旧的android版本上不可用。该块甚至不在构造函数中,而是在onClick方法之一中,因此甚至没有执行该代码,但是,当我尝试创建该片段时,应用程序始终会由于VerifyError崩溃。

通过使用instanceof check更改子句块来解决:

崩溃:

try {
    ...
} catch (FileUriExposedException e) {
    ...
}

工作正常:

try {
    ...
} catch (Exception e) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && e instanceof FileUriExposedException) {
        ...
    }
}

答案 1 :(得分:0)

您是否正在使用android.support.v4.app.Fragment中的support Fragment类?如果是这样,您需要致电

getSupportFragmentManager()
代替
getFragmentManager()

请注意,现已弃用android.app.Fragment中的Fragment类。