2015-09-03 3 views
3
private String[] words; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mDecorView = getWindow().getDecorView(); 

    loadWords(); 

    TextView tv = (TextView) findViewById(R.id.word); 
    tv.setText(words[0]); 
} 

public void loadWords() 
{ 

    try { 
     InputStream file = new FileInputStream("words.txt"); 
     InputStreamReader sr = new InputStreamReader(file); 
     BufferedReader br = new BufferedReader(sr); 

     int n = 0; 
     while(br.readLine() != null) 
     { 
      words[n] = br.readLine(); 
      n++; 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Хорошо, так что я только пытаюсь напечатать первый элемент в массиве, но приложение падает во время запуска и дает мне ошибку «Попытка чтения из пустого массива»Попытка загрузить текстовый файл в массив по строкам, но массив остается нулевым, что я делаю неправильно? (Java, Android студия)

EDIT - Решение
-I не инициализировать массив (я знал, что 100 строк)
-Мой входной поток был неправильно (мой файл не может быть найден)
-I пытался обновить TextView с. (который не был выбран в то время)

String[] words = new String[100]; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mDecorView = getWindow().getDecorView(); 
    loadWords(); 
} 

public void changeView(View view) { 

    setContentView(R.layout.game_view); 
    TextView tv = (TextView) findViewById(R.id.word); 
    tv.setText(words[0]); 
} 

public void loadWords() 
{ 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("words.txt"))); 
     for(int i = 0;i<words.length;i++) 
     { 
      words[i] = br.readLine(); 
     } 
     br.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

проверить 'word.lenght> 0' перед доступом к значению из массива. – Rustam

+0

использовать динамический список 'ArrayList' вместо' String [] ' – Rustam

+0

@Rustam: возможно, неплохая идея; так как его код выглядит 'words' равно null. Однако при вызове .length на null не будет ничего хорошего. И ваш второй комментарий тоже не слишком полезен - просто замена типа не поможет вообще; поскольку другое объявление без инициализации все равно приведет к сбою его программы с помощью исключения NullPointerException. – GhostCat

ответ

1

Скорее всего, вы никогда не инициализировали свой массив. Вы только что объявили это.

Дело в том, что ваш код просто говорит: Я хотел бы использовать массив строк (String[] words).

Но для того, чтобы на самом деле сделать это - вы должны создать массив объектов для заполнения (см here по-разному, как это сделать)

С другой стороны: «просто создавая массив»; может быть довольно сложно; учитывая, что вы можете не знать, сколько строк вам понадобится в вашем массиве (но вы должны знать, что при инициализации объекта массива).

Итак, я предлагаю использовать динамический класс коллекции, например ArrayList<String>, вместо массива фиксированного размера. Просто google это; и к исследованиям, которые вы должны были сделать, прежде чем публиковать этот вопрос ... ну, потом.

+0

Благодарим вас за очень полезный ответ! Обычно у меня есть тенденция забывать такие вещи, когда я не программировал какое-то время ... В любом случае после инициализации массива мне удалось найти еще несколько ошибок. Я обновляю свой пост рабочим решением. Кстати, я много искал в google, чтобы найти свою проблему, но я не был уверен, откуда моя ошибка (я, возможно, не лучший в поиске информации о google), но нет необходимости в этой грубости. – Siber

2

Вам необходимо инициализировать массив, который вы не делали. Объявление массива и инициализация - это другое дело, не так ли?

Инициализация массива будет сделано так:

private String[] words = new String[2000]; 

Пожалуйста, попробуйте. Однако попробуйте заменить ArrayList вместо array