Maison >Java >javaDidacticiel >Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation d'une méthode virtuelle « ... » sur une référence d'objet nulle » lors de la navigation entre les activités ?

Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation d'une méthode virtuelle « ... » sur une référence d'objet nulle » lors de la navigation entre les activités ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 17:48:17681parcourir

Why Does My Android App Crash with

Comprendre l'erreur : "Tentative d'invocation de la méthode virtuelle '..." sur une référence d'objet nul"

Lors de la tentative de navigation depuis SplashActivity à LoginActivity, l'application plante avec l'erreur suivante :

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

Root Cause du problème :

L'erreur suggère qu'une référence à un objet Java renvoie null, empêchant l'exécution d'une opération qui nécessite un objet valide. Dans ce cas, il s'agit de l'initialisation des éléments de vue dans le code LoginActivity.java.

Solution :

La résolution réside dans l'initialisation correcte des éléments de vue avant de référencer les dans le code. La réponse fournie identifie à juste titre que l'initialisation des éléments de vue en dehors de onCreate() peut conduire à des références nulles.

Pour résoudre le problème, déclarez les champs de vue dans LoginActivity.java sans initialisation, comme suit :

private EditText usernameField, passwordField;
private TextView error;
private ProgressBar progress;

Ensuite, attribuez des valeurs aux champs dans onCreate() méthode :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    usernameField = (EditText)findViewById(R.id.username);
    passwordField = (EditText)findViewById(R.id.password);
    error = (TextView)findViewById(R.id.error);
    progress = (ProgressBar)findViewById(R.id.progress);
}

Optimisation supplémentaire :

Comme suggéré dans la réponse, utiliser Handler au lieu de Timer pour planifier la transition de SplashActivity à LoginActivity est une meilleure pratique recommandée, car elle garantit l'exécution sur le thread de l'interface utilisateur, évitant les problèmes potentiels et garantissant une expérience utilisateur plus fluide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn