Ezekiel
Ezekiel

Reputation: 333

How to fix java lang arrayadapter index out of bound?

I tried to add a new block of items and I got error and I deleted the whole codes for the new block but I'm still getting this error. Can someone help me please to fix the error and add a new block of items to my sliding menu, please?

Here is my MainActivity.java:

package com.orar.cngcnasaud;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity implements OnClickListener {

    private ListView mDrawerList;
    private DrawerLayout mDrawer;
    private CustomActionBarDrawerToggle mDrawerToggle;
    private String[] menuItems;


    private static final String TAG = "AudioDemo";
    private static final String isPlaying = "Media is Playing"; 
    private static final String notPlaying = "Media has stopped Playing"; 

    MediaPlayer player;
    Button playerButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_drawer);
        player = MediaPlayer.create(this, R.raw.gc);

        player.setLooping(false); // Set looping

        // Get the button from the view
        playerButton = (Button) this.findViewById(R.id.buttonmp);
        playerButton.setText(R.string.play_label);
        playerButton.setTextColor(Color.WHITE);
        playerButton.setOnClickListener((OnClickListener) this);







        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        // set a custom shadow that overlays the main content when the drawer
        // opens
        mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        _initMenu();
        mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
        mDrawer.setDrawerListener(mDrawerToggle);
    }

        public void onClick(View v) {
            Log.d(TAG, "onClick: " + v);
            if (v.getId() == R.id.buttonmp) {
                playPause();
            }

    }




    private void demoPause() {
        // TODO Auto-generated method stub
        player.pause();
        playerButton.setText(R.string.play_label);

        Log.d(TAG, notPlaying);
}

    private void playPause() {
        // TODO Auto-generated method stub
        if(player.isPlaying()) {
          demoPause();
        } else {
          demoPlay();
        }   
    }

    private void demoPlay() {
        // TODO Auto-generated method stub
        player.start();
        playerButton.setText(R.string.stop_label);

        Log.d(TAG, isPlaying);
}




    private void _initMenu() {
        NsMenuAdapter mAdapter = new NsMenuAdapter(this);

        // Add Header
        mAdapter.addHeader(R.string.ns_menu_main_header);

        // Add first block

        menuItems = getResources().getStringArray(
                R.array.ns_menu_items);
        String[] menuItemsIcon = getResources().getStringArray(
                R.array.ns_menu_items_icon);

        int res = 0;
        for (String item : menuItems) {

            int id_title = getResources().getIdentifier(item, "string",
                    this.getPackageName());
            int id_icon = getResources().getIdentifier(menuItemsIcon[res],
                    "drawable", this.getPackageName());

            NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon);
            if (res==1) mItem.counter=0; //it is just an example...
            if (res==3) mItem.counter=0; //it is just an example...
            mAdapter.addItem(mItem);
            res++;
        }



        mDrawerList = (ListView) findViewById(R.id.drawer);
        if (mDrawerList != null)
            mDrawerList.setAdapter(mAdapter);

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }




    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        /*
         * The action bar home/up should open or close the drawer.
         * ActionBarDrawerToggle will take care of this.
         */
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }

        // Handle your other action bar items...
        return super.onOptionsItemSelected(item);
    }

    private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

        public CustomActionBarDrawerToggle(Activity mActivity,DrawerLayout mDrawerLayout){
            super(
                mActivity,
                mDrawerLayout, 
                R.drawable.ic_drawer,
                R.string.ns_menu_open, 
                R.string.ns_menu_close);
        }

        @Override
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(getString(R.string.ns_menu_close));
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(getString(R.string.ns_menu_open));
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    }

    private class DrawerItemClickListener implements ListView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            mDrawerList.setItemChecked(position, true);         
            mDrawer.closeDrawer(mDrawerList);
            if (position == 1) {
                Intent intent = new Intent(MainActivity.this, Istoric.class);
                startActivity(intent);
                mDrawer.closeDrawers();
            }
            else if (position == 2) {
                Intent intent2 = new Intent(MainActivity.this, Profesori.class);
                startActivity(intent2);
                mDrawer.closeDrawers();
            }
            if (position == 3) {
                Intent intent3 = new Intent(MainActivity.this, Elevi.class);
                startActivity(intent3);
                mDrawer.closeDrawers();
            }
            if (position == 4) {
                Intent intent4 = new Intent(MainActivity.this, ShowImageActivity.class);
                startActivity(intent4);
                mDrawer.closeDrawers();
            }

            if (position == 5) {
                Intent intent5 = new Intent(MainActivity.this, Despre.class);
                startActivity(intent5);
                mDrawer.closeDrawers();
            }
            if (position == 6) {
                Intent intent6 = new Intent(MainActivity.this, Feedback.class);
                startActivity(intent6);
                mDrawer.closeDrawers();
            }

        }



    }
        }

And here is my logcat:

02-26 19:00:15.198: E/AndroidRuntime(1308): FATAL EXCEPTION: main
02-26 19:00:15.198: E/AndroidRuntime(1308): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.orar.cngcnasaud/com.orar.cngcnasaud.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.os.Looper.loop(Looper.java:137)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.ActivityThread.main(ActivityThread.java:5041)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at java.lang.reflect.Method.invokeNative(Native Method)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at java.lang.reflect.Method.invoke(Method.java:511)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at dalvik.system.NativeStart.main(Native Method)
02-26 19:00:15.198: E/AndroidRuntime(1308): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4
02-26 19:00:15.198: E/AndroidRuntime(1308):     at com.orar.cngcnasaud.MainActivity._initMenu(MainActivity.java:126)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at com.orar.cngcnasaud.MainActivity.onCreate(MainActivity.java:64)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.Activity.performCreate(Activity.java:5104)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-26 19:00:15.198: E/AndroidRuntime(1308):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
02-26 19:00:15.198: E/AndroidRuntime(1308):     ... 11 more

Thanks a lot !

Upvotes: 0

Views: 1536

Answers (3)

Melquiades
Melquiades

Reputation: 8598

ArrayIndexOutOfBoundsException is thrown, because you are accessing an array item at index 4, but your array (menuItemsIcon) contains only 4 elements.

You have 2 arrays: menuItems and menuItemsIcon, and in your for loop you are using an enhanced version of it to iterate through menuItems, AT THE SAME TIME, you are using res to access menuItemsIcon elements, which you increment in your for loop. Now, there are less elements in menuItemsIcon array (it's length is 4), so when trying to access element at index 4, you get your exception.

You have few options to fix this:

  • make sure both arrays contain the same number of elements, or
  • before incrementing res, check if res already equals length-1 of an array it's being used to access elements from (menuItemsIcon in your case), and either don't increment, or reset to 0, or whatever suits you, or
  • iterate over the shorter array in for loop body, and use index to access the longer array - of course, this is not ideal, as you won't be using all elements of the longer array

Upvotes: 0

donfuxx
donfuxx

Reputation: 11321

I think your code can be fixed like this:

  int res = 0;
    for (String item : menuItems) {

        int id_title = getResources().getIdentifier(item, "string",
                this.getPackageName());
        if (res < menuItemsIcon.length) { //only if the array is big enough..
               int id_icon = getResources().getIdentifier(menuItemsIcon[res],
                "drawable", this.getPackageName());
        }

        NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon);
        if (res==1) mItem.counter=0; //it is just an example...
        if (res==3) mItem.counter=0; //it is just an example...
        mAdapter.addItem(mItem);
        res++;
    }

Edit: corrected the res-1 thing an add check for array length instead...

Upvotes: 1

Talador12
Talador12

Reputation: 148

At line 126 (within _initMenu()), your loop is calling an index outside of the array. An array of length 4 should contain indexes of 0,1,2,3.

02-26 19:00:15.198: E/AndroidRuntime(1308): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 02-26 19:00:15.198: E/AndroidRuntime(1308): at com.orar.cngcnasaud .MainActivity._initMenu(MainActivity.java:126)

Upvotes: 2

Related Questions