0

I am getting occasional null pointer exception in an Activity which extends AppCompatActivity. Please note that it happens occasionally and hence rest of the time code works just fine. The onStart function in the activity is pretty much empty and only calls super function as below.

@Override
protected void onStart() {
    super.onStart();  //**<---- line 242**
}

and this is crashlog

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.korneto.android/com.korneto.android.activities.GenericActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1654)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1670)
    at android.app.ActivityThread.access$1500(ActivityThread.java:118)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3704)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at android.support.v4.app.BackStackRecord.run(SourceFile:714)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1501)
    at android.support.v4.app.FragmentActivity.onStart(SourceFile:551)
    at com.korneto.android.activities.GenericActivity.onStart(SourceFile:242)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
    at android.app.Activity.performStart(Activity.java:3791)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1627)

OnCreate

// Checks if fragment has already been added, otherwise add a new
    mFragment = getSupportFragmentManager().findFragmentByTag(tag);

    if (mFragment != null) {
        Utils.bringFragmentToTop(getSupportFragmentManager(), mFragment);
        return;
    }

    if(isDialog) {
        try {
            Fragment fragment = (Fragment) fragmentClass.newInstance();
            if (null != b) {
                fragment.setArguments(b);
            }
            ((DialogFragment) fragment).show(getSupportFragmentManager(), tag);
            getSupportFragmentManager().executePendingTransactions();
            return;
        } catch (Exception e) {}

    }

    Utils.startFragment(getSupportFragmentManager(), fragmentClass, R.id.generic_frame, tag, b, addToStack);

Below is Utils.startFragment code

public static Fragment startFragment(FragmentManager fm, Class c, int containerid, String tag, Bundle args, boolean addToStack) {
    if(TextUtils.isEmpty(tag)) {
        tag = getClassTag(c);
    }

    Fragment fragment = null;
    if(!TextUtils.isEmpty(tag)) {
        //if fragment is in backstack, we use it and return
        if(fm.popBackStackImmediate (tag, 0)) {
            return null;
        }

        //We see if Fragment manager has it
        fragment = fm.findFragmentByTag(tag);

        // if the fragment is currently visible, don't add it to stack or commit any trasaction
        if(null != fragment && fragment.isVisible()) {
            return fragment;
        }

    }

    if (fragment == null) {
        try {
            fragment = (Fragment) c.newInstance();
            if(null != args) {
                fragment.setArguments(args);
            }

        } catch (Exception e) {
            e.printStackTrace();
            return fragment;
        }
    }

    if(fragment instanceof DialogFragment) {
        DialogFragment df = (DialogFragment) fragment;

        // we do getDialog to check if setShowsDialog(false) was called on it (if dialog is used as both generic and dialog
        //if(null != df.getDialog()) {
            ((DialogFragment) fragment).show(fm, tag);
            fm.executePendingTransactions();
        return fragment;
        //}
    }

    FragmentTransaction transaction = fm.beginTransaction();
    if(fragment.isAdded()) {
        transaction.show(fragment);
    }
    else
        transaction.replace(containerid, fragment, tag);

    if(addToStack)
        transaction.addToBackStack(tag);

    if(null != args && args.getBoolean("commitAllowingStateLoss", false)) {
        Log.d(TAG, "commitAllowingStateLoss");
        transaction.commitAllowingStateLoss();
    }
    else
        transaction.commit();

    return fragment;

}

Any ideas?

mesibo
  • 3,970
  • 6
  • 25
  • 43

0 Answers0