web-dev-qa-db-fra.com

- Java.lang.NullPointerException - setText sur une référence d'objet null

C'est ce que j'essaie de faire pendant plusieurs heures: j'ai un fichier MainActivity.Java (liste ci-dessous) et un fichier fragment_start.xml avec un bouton de démarrage. Le fait de toucher le bouton Démarrer doit afficher le fichier activity_main.xml avec Text Views points/round et countdown. Cela ne fonctionne pas et voici ce qui se passe:

Le logcat me dit: PID: 1240 Java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle 'void Android.widget.TextView.setText (Java.lang.CharSequence)' sur une référence d'objet null

L'émulateur affiche: Malheureusement, GAME s'est arrêté.

Nécessaire de mentionner que je suis plutôt nouveau dans la programmation?

Merci pour tout conseil!

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;


public class MainActivity extends Activity implements View.OnClickListener {

private int points;
private int round;
private int countdown;

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

private void newGame () {
    points=0;
    round=1;
    initRound();
}

private void initRound() {
    countdown = 10;
    update();
}

private void update () {
    fillTextView(R.id.points, Integer.toString(points));
    fillTextView(R.id.round, Integer.toString(round));
    fillTextView(R.id.countdown, Integer.toString(countdown * 1000));
}

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text);
}

private void showStartFragment() {
    ViewGroup container = (ViewGroup) findViewById(R.id.container);
    container.removeAllViews();
    container.addView(
            getLayoutInflater().inflate(R.layout.fragment_start, null) );
    container.findViewById(R.id.start).setOnClickListener(this);
}

@Override
public void onClick(View view) {
    if(view.getId() == R.id.start) {
        startGame();
    }
}

public void startGame() {
    newGame();
}
}
27
George

Le problème est la tv.setText(text). La variable tv est probablement null et vous appelez la méthode setText sur ce null, ce que vous ne pouvez pas. Je suppose que le problème concerne la méthode findViewById, mais ce n’est pas ici, donc je ne peux pas en dire plus sans le code.

27
JustOneJavaDev

Voici votre problème:

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text); // tv is null
}

-> (TextView) findViewById (id); // renvoie null Mais à partir de votre code, je ne trouve pas pourquoi cette méthode renvoie null. Essayez de repérer quel identifiant vous donnez comme paramètre et si cette vue avec l'identifiant spécifié existe.

Le message d'erreur est très clair et vous indique même à quelle méthode. De la documentation:

public final View findViewById (int id)
    Look for a child view with the given id. If this view has the given id, return this view.
    Parameters
        id  The id to search for.
    Returns
        The view that has the given id in the hierarchy or null

http://developer.Android.com/reference/Android/view/View.html#findViewById%28int%29

En d'autres termes: vous n'avez aucune vue avec l'identifiant que vous donnez comme paramètre.

20
ProgrammingIsAwsome
private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text);
}

Si c'est là que vous obtenez l'exception de pointeur null, aucune vue n'a été trouvée pour l'id que vous avez passé dans findViewById(), et l'exception réelle est levée lorsque vous essayez d'appeler une fonction setText() sur null. Vous devriez poster votre code XML pour R.layout.activity_main, Car il est difficile de savoir où les choses se sont mal passées en regardant simplement votre code.

Plus de lecture sur les pointeurs nuls: Qu'est-ce qu'une exception NullPointerException et comment puis-je la résoudre?

4
mgomov