2012-06-10 2 views
0

Я получаю исключение ArrayOutOfBounds, когда я использую свой пользовательский адаптер массива.ArrayAdapter throwing ArrayIndexOutOfBoundsException

Мне интересно, есть ли ошибки кодирования, которые я забыл.

Вот журнал ошибок:

06-10 20:21:53.254: E/AndroidRuntime(315): FATAL EXCEPTION: main 
06-10 20:21:53.254: E/AndroidRuntime(315): java.lang.RuntimeException: Unable to start activity ComponentInfo{alex.android.galaxy.tab.latest/alex.android.galaxy.tab.latest.Basic_db_output}: java.lang.ArrayIndexOutOfBoundsException 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.os.Looper.loop(Looper.java:123) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.ActivityThread.main(ActivityThread.java:4627) 
06-10 20:21:53.254: E/AndroidRuntime(315): at java.lang.reflect.Method.invokeNative(Native Method) 
06-10 20:21:53.254: E/AndroidRuntime(315): at java.lang.reflect.Method.invoke(Method.java:521) 
06-10 20:21:53.254: E/AndroidRuntime(315): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
06-10 20:21:53.254: E/AndroidRuntime(315): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
06-10 20:21:53.254: E/AndroidRuntime(315): at dalvik.system.NativeStart.main(Native Method) 
06-10 20:21:53.254: E/AndroidRuntime(315): Caused by: java.lang.ArrayIndexOutOfBoundsException 
06-10 20:21:53.254: E/AndroidRuntime(315): at alex.android.galaxy.tab.latest.Basic_db_output.onCreate(Basic_db_output.java:44) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-10 20:21:53.254: E/AndroidRuntime(315): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

Я основывая мой пример кода на это: How to use ArrayAdapter<myClass>.

ArrayList<Question> list = new ArrayList<Question>(); 

for(int i=1; i <= 3; i++) 
{  
    path = getAssets().open("quiz"+i+".txt"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Reader reader = new ResultsReader(path); 
    reader.read(); 

    String str = ((ResultsReader)reader).getInput(); 
    String data[] = str.split("<.>"); 

    Question q = new Question(); 

    q.question = data[0]; 
    q.answer = Integer.parseInt(data[1]); 
    q.choice1 = data[2]; 
    q.choice2 = data[3]; 
    q.choice3 = data[4]; 
    list.add(q); 
} 
+2

Но ваша ошибка появляется в вашей реализации 'Activity # onCreate (..)', как показано в разделе «Basic_db_output.onCreate (Basic_db_output.java:44)». – Jens

+0

Вот что я вижу. @alex, отправьте класс Basic_db_output, чтобы мы могли попытаться выяснить, что происходит. – Barak

+0

Я думаю, что это что-то делать с файлами, которые не читаются. В java точно такой же код работает отлично – alex

ответ

1

Когда вы

String data[] = str.split("<.>"); 

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

q.question = data[0]; 
    q.answer = Integer.parseInt(data[1]); 
    q.choice1 = data[2]; 
    q.choice2 = data[3]; 
    q.choice3 = data[4]; 

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

Например:

if(data.length == 4){ 
     q.question = data[0]; 
     q.answer = Integer.parseInt(data[1]); 
     q.choice1 = data[2]; 
     q.choice2 = data[3]; 
     q.choice3 = data[4]; 
} else { 
    Log.e("YourApp", "Data was not split from file correctly"); 
} 

или добавить еще немного отладки, прежде чем использовать массив сплит данных:

for(int i=0; i < data.length; i++){ 
    Log.d("YourApp", "DataReceived:"+data[i]; 
} 

Редактировать

Ах да вопрос будет эмулятор/ваш телефон не понял, что такое

C:/ 

есть.

+0

, если это так, какой путь я использую, поскольку я тестирую его на эмуляторе – alex

+0

@alex у вас есть несколько выбор, поместите его в папку с ресурсами вашего приложения, поместите его в/res/raw вашего приложения, положите его на SD-карту своего эмулятора – Blundell

+0

, спасибо за хорошую точку. очень хороший ответ – alex