2012-01-13 56 views
0

我已經在Android Market上的應用程序,用戶報到偶然的ArrayIndexOutOfBounds錯誤(強制關閉)。我從來沒有經歷過這個錯誤,所以我很難找出問題所在。我希望有更多天才的程序員可以看看它。這發生在有些人查看這個文件對話框時。的ArrayIndexOutOfBounds Android的錯誤

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

打印(listOfFiles.length),輸出什麼讓步? – 2012-01-13 13:44:38

回答

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 [I]具有相同的位置,listOfFiles [I],但你之前訂購,所以也許它不是同一個文件?

無論如何,除此之外,你問了一遍又一遍相同的。 (if(listOfFiles [i] .isFile()){)如果您有完整的堆棧跟蹤,請發佈它。

0

你聲明瞭「TextView的」最後的回答。在最終字段中存儲對象的引用將使您的引用不可變。它不會產生任何問題?