2012-01-13 2 views
0

У меня есть приложение на рынке Android, где пользователи сообщают о случайных ошибках ArrayIndexOutofBounds (force close). Я никогда не испытывал этой ошибки сам, поэтому мне сложно понять проблему. Я надеялся, что более одаренный программист сможет взглянуть на него. Это происходит, когда некоторые люди просматривают диалог этого файла.Android arrayindexoutofbounds error

public void fileDialog() { 
    // TODO Auto-generated method stub 
    d = new Dialog(this); 
    d.setTitle("Choose the song file"); 
    if (canWriteToFlash()) { 

    ScrollView sview = new ScrollView(this); 
    LinearLayout holder = new LinearLayout(this); 
    holder.setOrientation(1); 

    String path = Environment.getExternalStorageDirectory().getPath() 
     + File.separator + "Music" + File.separator; 

    File folder = new File(path); 
    File[] listOfFiles = folder.listFiles(); 
    int count = 0; 
    // count files in directory 
    for (int i = 0; i < listOfFiles.length; i++) { 

     if (listOfFiles[i].isFile()) { 
      count++; 

     } 
    } 
    if (count == 0) { 
    TextView empty1 = new TextView(this); 
     empty1.setText("The folder sdcard/Music, is empty. You must add song files in order to attach music to lyrics."); 
     empty1.setTextSize(18); 
     empty1.setPadding(8, 0, 8, 8); 
     holder.addView(empty1); 
    } 

    // turn files into string array 
    String[] sfiles = new String[count]; 
    for (int i = 0; i < listOfFiles.length; i++) { 
     if (listOfFiles[i].isFile()) { 
      sfiles[i] = listOfFiles[i].getName(); 
     } 
    } 
    // Sort Array case insenstive 
    Arrays.sort(sfiles, String.CASE_INSENSITIVE_ORDER); 
    // create text 
    TextView[] t1 = new TextView[(count)]; 
    for (int i = 0; i < listOfFiles.length; i++) { 
     if (listOfFiles[i].isFile()) { 
      t1[i] = new TextView(this); 
      t1[i].setText(sfiles[i]); 
      t1[i].setPadding(7, 8, 7, 8); 
      t1[i].setTextSize(18); 
      holder.addView(t1[i]); 
     } 
    } 
    // Create Click 
    for (int i = 0; i < listOfFiles.length; i++) { 
     if (listOfFiles[i].isFile()) { 
     final TextView thetext = t1[i]; 
     thetext.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
      // TODO Auto-generated method stub 
       songname = (String) thetext.getText(); 
       songfile.setText(songname); 
       d.cancel(); 
      } 
     }); 
    } 
    } 

    sview.addView(holder); 
    d.setContentView(sview); 
     } else { 
     TextView usbt = new TextView(this); 
     usbt.setText("Cannot communicate with sdcard! Make sure that USB connected is not enabled. Or try unplugging your USB cord."); 
     usbt.setPadding(7, 8, 7, 8); 
      usbt.setTextSize(18); 
     d.setContentView(usbt); 
    } 

    d.show(); 
} 
+0

печать (списокOfFiles.length), какой выход дать? –

ответ

0

Я не так:

if (listOfFiles[i].isFile()) { 
      t1[i] = new TextView(this); 
      t1[i].setText(sfiles[i]); 
      t1[i].setPadding(7, 8, 7, 8); 
      t1[i].setTextSize(18); 
      holder.addView(t1[i]); 
     } 

Вы предполагающие sFiles [я] имеет такое же положение, как listOfFiles [I], но вы заказали раньше, так что, может быть, его не один и тот же файл?

В любом случае, кроме того, вы спрашиваете то же самое снова и снова. (if (listOfFiles [i] .isFile()) {) Если у вас есть полный стек, отправьте его.

0

Вы объявили свой «TextView» окончательным. Сохранение ссылки на объект в конечном поле сделает вашу ссылку неизменной. Это не создает никаких проблем?

Смежные вопросы