textviewArray [я] .setText (StringArray [I]); нулевой - PullRequest
0 голосов
/ 06 апреля 2020

Я создал TextView Array и определил каждый элемент в массиве. Я получил массив String с намерением, но когда я попытался установить текстовый просмотр текста с элементами, которые получили строковый массив с для l oop, он возвратил ноль, что не так с этим коды? Я новичок в java и

public class dizilisActivity extends AppCompatActivity {
TextView player1, player2,player3,player4,player5,player6,player7,player8,player9,player10;
TextView[] players = {player1, player2,player3,player4,player5,player6,player7,player8,player9,player10};
String[] receivedNames;


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dizilis);
    player1= (TextView) findViewById(R.id.player1);
    player2= (TextView) findViewById(R.id.player2);
    player3= (TextView) findViewById(R.id.player3);
    player4= (TextView) findViewById(R.id.player4);
    player5= (TextView) findViewById(R.id.player5);
    player6 = (TextView) findViewById(R.id.player6);
    player7 = (TextView) findViewById(R.id.player7);
    player8 = (TextView) findViewById(R.id.player8);
    player9 = (TextView) findViewById(R.id.player9);
    player10 = (TextView) findViewById(R.id.player10);
    Intent intent = getIntent();
    receivedNames = intent.getStringArrayExtra("names");
    for (int i = 0; i<receivedNames.length; ++i)
    players[i].setText(receivedNames[i]);

    }

}

и logcat

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

и строка 33 -

players[i].setText(receivedNames[i];

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

TL; DR

1) Измените значение с

TextView[] players = {player1, player2,player3,player4,player5,player6,player7,player8,player9,player10}

на

TextView[] players;

2) Переместите инициализацию, поэтому после

player10 = (TextView) findViewById(R.id.player10);

добавить:

players = new TextView[]{player1, player2, player3, player4, player5, player6, player7, player8, player9, player10};

3) Когда receivedNames будет null, вы можете добавить дополнительное условие, например:

// Check if receivedNames are NOT null
if (receivedNames != null) {
    for (int i = 0; i < receivedNames.length; ++i) {
        // here rest of codes
    }
}

Объяснение ошибки

1) Строка:

TextView player1, player2,player3,player4,player5,player6,player7,player8,player9,player10;

приводит к объявлению 10 переменных. Все они null s

2) Таким образом, в следующей строке:

TextView[] players = {player1, player2,player3,player4,player5,player6,player7,player8,player9,player10};

объявляет новый массив и инициализирует его значениями null, поэтому вы массив 10 null s внутри.

[null, null, null, null, null, null, null, null, null, null]

3) Когда в onCreate() вы пытаетесь вызвать players[i].setText(...), players[i] имеет значение null. Итак, вы звоните setText на null. Это и есть причина sh.

Полный рабочий код:

public class MainActivity extends AppCompatActivity {
    TextView player1, player2, player3, player4, player5, player6, player7, player8, player9,
            player10;

    TextView[] players;

    String[] receivedNames;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dizilis);

        player1 = findViewById(R.id.player1);
        player2 = findViewById(R.id.player2);
        player3 = findViewById(R.id.player3);
        player4 = findViewById(R.id.player4);
        player5 = findViewById(R.id.player5);
        player6 = findViewById(R.id.player6);
        player7 = findViewById(R.id.player7);
        player8 = findViewById(R.id.player8);
        player9 = findViewById(R.id.player9);
        player10 = findViewById(R.id.player10);

        players = new TextView[]{player1, player2, player3, player4, player5, player6, player7,
                player8, player9, player10};

        Intent intent = getIntent();
        receivedNames = intent.getStringArrayExtra("names");

        if (receivedNames != null) {
            for (int i = 0; i < receivedNames.length; ++i) {
                players[i].setText(receivedNames[i]);
            }
        }
    }
}

TIP # 1

Хорошей практикой является получение индекса из более короткого или "вызывающего больше проблем" ", поэтому вы можете изменить значение:

i < receivedNames.length

на:

i < players.length

Когда вы получаете меньше данных от getStringArrayExtra() = ничего не происходит (просто пустые TextViews).

Но когда вы попытаетесь присвоить TextView, который не существует, или возможности в массиве, который не существует = CRA SH

TIP # 2

Если у вас будет такой же / Аналогично проблеме с циклами вы можете:

  • использовать точки останова (о сборке Android приложение в режиме debug) или
  • добавить простой блок try-catch, чтобы проверить, какой индекс вызывая проблему. Например:
for (int i = 0; i < receivedNames.length; ++i) {
    try {
        players[i].setText(receivedNames[i]);
    } catch (Exception e) {
        System.out.println("Problem with id = " + i);
    }
}
0 голосов
/ 06 апреля 2020

Кажется, вы сначала инициализируете массив нулевыми ссылками на текстовые представления, а не обновляете ссылки там после players[index]=(TextView) findViewById(R.id.player1). Вместо этого создайте пустой массив, а затем используйте для l oop динамическое получение идентификатора текстового представления и объекта pu sh в массив.

public class dizilisActivity extends AppCompatActivity {
TextView[] players = new TextView[10];
String[] receivedNames;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dizilis);
    for(int i=0;i<10;i++){
      String textViewId="player"+(i+1);
      int resID = getResources().getIdentifier(textViewId, "id", getPackageName());
      players[i]=(TextView) findViewById(resID);
    }
    Intent intent = getIntent();
    receivedNames = intent.getStringArrayExtra("names");
    for (int i = 0; i<receivedNames.length; ++i)
         players[i].setText(receivedNames[i]);
}
0 голосов
/ 06 апреля 2020

Похоже, вы никогда не обновляете значения в массиве. Поскольку вы знаете, что у вас будет 10 представлений в массиве, попробуйте следующее.

private final TextView[] views = new TextView[10];

protected void onCreate(Bundle savedInstanceState) {
   views[0] = (TextView) findViewById(R.id.player1);
   views[1] = (TextView) findViewById(R.id.player2);
   // ... and so forth
}
...