Java исключение нулевого указателя на TextView.setText () - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблема с моим кодом.Я работаю в Android Studio, и когда я запускаю свой код, я получаю эту ошибку:

java.lang.NullPointerException: попытка вызвать виртуальный метод void android.widget.TextView.setText (java.lang.CharSequence) 'для ссылки на пустой объект

Я ищу на многих веб-сайтах и ​​не могу найти никаких ответов.

Вот мой код:

my Activity Action.java:

public class Action extends AppCompatActivity {
    private TextView nbDef;
    private TextView printPlayer;
    private final List<String> name = new Vector<>();
    private final HashMap<String, Integer> score = new HashMap<>();
    private String mode;
    private int nbAllTurn;
    private String TurnPlayer;
    private int nbTurn = 0;
    private int idPlayer = 0;

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

        setContentView(R.layout.activity_action);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        nbDef = findViewById(R.id.number);
        printPlayer = findViewById(R.id.challenge);

        nbDef.setText("0/" + nbAllTurn);

        Intent intent = getIntent();
        mode = intent.getStringExtra("mode");
        nbAllTurn = intent.getIntExtra("nbTurn", -1);
        String player = intent.getStringExtra("players");

        String[] rawPlayers = player.split("\n");

        for (String rawPlayer : rawPlayers) {
            name.add(rawPlayer);
            score.put(rawPlayer, 0);
        }
        DoAction();
    }

    private void DoAction() {
        List<String> OtherPlayers = new Vector<>();

        TurnPlayer = name.get(idPlayer);
        for (int index = 0; index < name.size(); index++) {
            if (!name.get(index).equals(TurnPlayer))
                OtherPlayers.add(name.get(index));
        }
        printPlayer.setText(TurnPlayer);

        List<String> challenges = new ArrayList<>();

        challenges.add(", raconte une anecdote gênante sur ");
        challenges.add(", fais un chifoumi avec ");
        challenges.add(", raconte une histoire chiante sur  ");
        challenges.add(", mange des chaussettes avec ");

        String choosePlayer = OtherPlayers.get(new Random().nextInt(OtherPlayers.size()));
        String chooseChallenge = challenges.get(new Random().nextInt(challenges.size()));
        String playerAction = printPlayer.getText().toString() + chooseChallenge;
        printPlayer.setText(playerAction);
        String playersAction = printPlayer.getText().toString() + choosePlayer;
        printPlayer.setText(playersAction);

        String challengeNum = Integer.toString(nbTurn) + "/" + Integer.toString(nbAllTurn);

        nbDef.setText(challengeNum);

        idPlayer += 1;

        if (idPlayer == name.size()) {
            idPlayer = 0;
        }

        nbTurn +=1;

        if (nbTurn == nbAllTurn) {
            StringBuilder builder = new StringBuilder();

            for (String name : score.keySet()) {
                builder.append(name).append(" : ").append(score.get(name)).append("\n");
            }

            Intent intent = new Intent(this, ScoreBoard.class);
            intent.putExtra("datas", builder.toString());
            startActivity(intent);

            finish();
        }
    }

    public void successClick(View v) {
        DoAction();

        score.put(TurnPlayer, score.get(TurnPlayer) + 1);
    }

    public void failClick(View v) {
        DoAction();
    }
}

Ошибка появляется в методе onCreate в строке nbDef.setText.

Вот XML-файл: activity_action.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/body_action_back"
    tools:context=".Action"
    tools:layout_editor_absoluteY="25dp">

<TextView
        android:id="@+id/challenge"
        android:layout_width="0dp"
        android:layout_height="127dp"
        android:layout_marginEnd="56dp"
        android:textAlignment="center"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/imageView2"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.373"
        tools:maxLines="5" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="0dp"
        android:layout_height="172dp"
        android:layout_marginStart="69dp"
        android:contentDescription="@string/cartoon"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/challenge"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.334"
        app:srcCompat="@drawable/pikachu" />

    <!--<RelativeLayout
        android:id="@+id/relativeLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="11dp"
        app:layout_constraintEnd_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </RelativeLayout>-->

    <ImageButton
        android:id="@+id/success_button"
        android:layout_width="186dp"
        android:layout_height="68dp"
        android:layout_marginStart="144dp"
        android:layout_marginTop="53dp"
        android:layout_marginEnd="59dp"
        android:layout_marginBottom="38dp"
        android:onClick="successClick"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/fail_button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView2"
        app:srcCompat="@drawable/successbutton" />

    <ImageButton
        android:id="@+id/fail_button"
        android:layout_width="186dp"
        android:layout_height="68dp"
        android:layout_marginStart="59dp"
        android:layout_marginTop="72dp"
        android:layout_marginEnd="156dp"
        android:layout_marginBottom="38dp"
        android:onClick="failClick"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/success_button"
        app:layout_constraintTop_toBottomOf="@+id/challenge"
        app:srcCompat="@drawable/failbutton" />

    <TextView
        android:id="@+id/number"
        android:layout_width="88dp"
        android:layout_height="53dp"
        android:layout_marginStart="41dp"
        android:layout_marginTop="119dp"
        android:layout_marginEnd="7dp"
        android:layout_marginBottom="7dp"
        android:textAlignment="center"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/fail_button"
        app:layout_constraintTop_toBottomOf="@+id/challenge"
        tools:maxLines="5"/>
</android.support.constraint.ConstraintLayout>

Неисправный TextView - последний с «числом» в качестве идентификатора.

Хорошо, я знаю, что такое исключение NullPointerException, но я не понимаю, почему это происходит сбой, потому что выполняют те же самые операции с printPlayer TextView иэто не сбой.

Большое спасибо за помощь, которую вы можете оказать мне!

1 Ответ

0 голосов
/ 28 февраля 2019

Я думаю, что здесь вы получаете NPE

nbDef = findViewById(R.id.number);

Единственная причина, по которой findViewById возвращает нулевое значение, если вы передаете действительный идентификатор, заключается в том, что вы либо устанавливаете неправильный вид содержимого (с setContentView)

...