0

I am getting an ArrayOutOfBounds exception when I am using my custom array adapter.

I am wondering if there are any coding errors I have overlooked.

Here is the error log:

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)

I am basing my code example on this: 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);
}
Community
  • 1
  • 1
alex
  • 398
  • 1
  • 6
  • 24
  • 2
    But your error appears to be in your `Activity#onCreate(..)` implementation, as shown by `Basic_db_output.onCreate(Basic_db_output.java:44)`. – Jens Jun 10 '12 at 20:53
  • That's what I see too. @alex, please post the Basic_db_output class so we can try and figure out what is going on. – Barak Jun 10 '12 at 21:17
  • i think its something todo with the files not being read in. In java the exact same code seems to work perfectly – alex Jun 10 '12 at 21:22

1 Answers1

1

When you do

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

it is going to return you an array of uncertain length, unless you know the input is correct all the time you are going to run into issues when you do the below:

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

Perhaps you should think of another technique where you don't rely on calling explicit index's of your array.

For example:

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

or add some more debug before you use the split data array:

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

Edit

Oh yeah the issue will be the emulator / your phone hasn't got a clue what

 C:/

is.

Blundell
  • 75,855
  • 30
  • 208
  • 233