web-dev-qa-db-fra.com

android.content.Context.getPackageName () 'sur une référence d'objet null

Bonjour, je travaille avec Fragments qui implémente une interface.

public class SigninFragment extends Fragment implements SigninInterface 

L'implémentation de la méthode de l'interface dans la classe fragment est la suivante.

@Override
public void afterSubmitClicked(String userId, Bundle bundle) {

    Log.d(TAG,"Calling time afterSubmitClicked called"+bundle);

    if(!userId.equals("-1")){
        //Logged in successfully
        //Move to MusicHome

        Intent mIntent = new Intent(getActivity(),MusicHome.class);
        mIntent.putExtra("SigninFragment.user_details", bundle);
        startActivity(mIntent);

    }else{
        //Logging in failed
        //show error dialog
    }

}

Cette méthode est appelée après l'exécution d'une classe AsynchronousTask (qui étend AsyncTask).

Mais je vais avoir un crash. Et le message d'erreur montre

Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.content.Context.getPackageName()' on a null object reference

Logcat

   02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.Android, PID: 28177
02-14 16:37:04.648: E/AndroidRuntime(28177): Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.content.Context.getPackageName()' on a null object reference
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.content.ComponentName.<init>(ComponentName.Java:77)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.content.Intent.<init>(Intent.Java:3996)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.Java:152)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.Java:92)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.Java:1)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.os.AsyncTask.finish(AsyncTask.Java:632)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.os.AsyncTask.access$600(AsyncTask.Java:177)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.Java:645)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.os.Handler.dispatchMessage(Handler.Java:102)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.os.Looper.loop(Looper.Java:135)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Android.app.ActivityThread.main(ActivityThread.Java:5221)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Java.lang.reflect.Method.invoke(Native Method)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at Java.lang.reflect.Method.invoke(Method.Java:372)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)

Je me suis essayé et exploré dans Google. Mais je n'ai pas eu de solution. Quelqu'un pourrait-il aider à ce sujet?

62
Karthikeyan Ve

J'ai trouvé l'erreur ce que j'ai fait. Nous devons extraire l'instance d'activité de la méthode de substitution OnAttach (). Par exemple,

public MainActivity activity;

@Override
public void onAttach(Activity activity){
    this.activity = activity;
}

Puis passez l'activité comme contexte comme suit.

Intent mIntent = new Intent(activity, MusicHome.class);
35
Karthikeyan Ve

Les réponses à cette question m'ont aidé à trouver mon problème, mais ma source était différente. J'espère donc que cela permettra de mieux comprendre si quelqu'un trouve cette page à la recherche de réponses au crash de contexte 'aléatoire':

J'avais spécifié un objet SharedPreferences et essayé de l'instancier à sa déclaration de niveau classe, comme suit:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref =
        PreferenceManager.getDefaultSharedPreferences(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...

Référencer this avant onCreate a provoqué l'erreur "Java.lang.NullPointerException: tentative d'appeler la méthode virtuelle 'Java.lang.String Android.content.Context.getPackageName ()' pour moi.

L'instanciation de l'objet à l'intérieur de onCreate () a résolu mon problème, comme suit:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

J'espère que ça t'as aidé.

23
mix3d

API Android niveau 23.

Utilisation

getContext ()

au lieu de

getActivity ()

getActivity () donne à l'activité parent un objet Context

Ici vous pouvez utiliser

Mon activité.

au lieu de

getActivity ()/getApplicationContext ()

19
sivaBE35

Pour moi, le problème était que je passais de l'activité au constructeur, pas du contexte.

public Adapter(Activity activity, List<MediaItem> items, boolean can) {
    mItems = items;
    canEdit = can;
    mActivity = activity;
}

et en utilisant cette activité pour getDefaultSharedPreferences (), j'ai donc changé l'activité en contexte et j'appelais toujours le constructeur Adapter avec MainActivity.this

4
SpyZip

Dans mon cas, l'erreur s'est produite à l'intérieur d'un Fragment sur cette ligne:

Intent intent = new Intent(getActivity(), SecondaryActivity.class);

C'est arrivé lorsque j'ai double-cliqué sur un élément qui a déclenché le code ci-dessus. Deux SecondaryActivity.class activités ont donc été lancées simultanément, l'une au-dessus de l'autre. J'ai fermé l'activité SecondaryActivity.class supérieure en appuyant sur le bouton Précédent, ce qui a déclenché un appel à getActivity() dans le SecondaryActivity.class qui est apparu au premier plan. L'appel à getActivity() a renvoyé null. C'est une sorte de bug bizarre Android, donc cela ne devrait généralement pas arriver. Vous pouvez bloquer les clics après que l'utilisateur ait cliqué une fois.

4
vovahost

Vous devez seulement faire ceci:

Intent myIntent = new Intent(MainActivity.this, nextActivity.class);

Ma classe n'est pas étendue à Activiti. J'ai résolu le problème de cette façon.

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
          ...
 holder.title.setOnClickListener({v->
                v.context.startActivity(Intent(context,  HomeActivity::class.Java))
            })
          ...
    }
1
Segrei Ulanov

J'ai eu le même problème en essayant de montrer un Toast dans un fragment.

Après un certain débogage, j'ai découvert que je retirais le fragment avant d'appeler:

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();

Comme le fragment avait été supprimé, le contexte est devenu nul, ce qui a provoqué l'exception.

Solution simple: appelez la getContext()avant de la supprimer le fragment.

1
renatoarg

Vous résolvez le problème avec un essai/attraper. Ce blocage se produit lorsque l'utilisateur ferme l'application avant l'intention de démarrage.

try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}
0
user2912087