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);
}
}