Array index out of bounds exception. Please help if you can : <p>Extremely close to having this task finished but can't see which part of this is holding me back. If anybody could put me on the right track I'd be very thankful. the following is the error code that eclipse gives me each time I try to run this.</p>

<p>**Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2</p>

<p>at lab01.EncodeDecode.backMap(EncodeDecode.java:162)</p>

<p>at lab01.EncodeDecode.Decode(EncodeDecode.java:68)</p>

<p>at lab01.EncodeDecode.(EncodeDecode.java:26)</p>

<p>at lab01.EncodeDecodeTester.main(EncodeDecodeTester.java:14)**</p>

<pre><code> package lab01;
import java.util.*;
/**
 * 
 * @author David Bierbrauer, 
 *
 */
public class EncodeDecode 
{
    //method declaration
    static String[] originalList,encodedList,decodedList;
    static int total;

    public EncodeDecode(String[] oL) 
    {

        //instance variable declaration
        total = oL.length;
        originalList = new String[total];
        encodedList = new String[total];
        decodedList = new String[total];
        originalList = oL;


        encodedList= Encode(originalList);      
        decodedList = Decode(encodedList);
    }

    public static String[] Encode (String[] originalList)
    {
        //declare control variables
        String currentWord = "", codedWord = "";
        char currentChar = ' ';
        int i = 0, j = 0, stringLength = 0;


        for (i=0; i &lt; total ; i++)
        {
            currentWord = originalList[i];
            stringLength = currentWord.length();

            for (j = 0; j &lt; stringLength; j++)
            {
                currentChar = currentWord.charAt(j);
                codedWord = codedWord +forwardMap(currentChar);
            }

            encodedList[i] = codedWord;
            codedWord = "";
        }
        return encodedList;
    }

    public static String[] Decode (String[] encodedList) 
    {
        String currentWord = "", encodedWord = "";
        char currentChar = ' ';
        int i =0, j=0, stringLength = 0;

        for(i = 0; i &lt; total; i++)
        {
            currentWord = encodedList[i];
            stringLength = currentWord.length();

            for(j = 0; j &lt; stringLength; j++)
            {
                currentChar = currentWord.charAt(j);
                encodedWord = encodedWord + backMap(currentChar);
            }

            decodedList[i] = encodedWord;
            encodedWord = "";
        }
        return decodedList;
    }

    public static char forwardMap(char currentChar)
    {
        char newChar = ' ';
        int i = 0;

        String encodeMapUpper = "CDEFGHIJKLMNOPQRSTUVWXYZAB";
        String encodeMapLower = "cdefghijklmnopqrstuvwxyzab";
        String encodeMapNumber = "2345678901";

        char [] encodeArrayUpper = encodeMapUpper.toCharArray();
        char [] encodeArrayLower = encodeMapLower.toCharArray();
        char [] encodeArrayNumber = encodeMapNumber.toCharArray();

        if(encodeMapUpper.indexOf(currentChar) != -1)
        {
            for( i = 0; i &lt; encodeArrayUpper.length; i++)
            {
                if(currentChar == encodeArrayUpper[i])
                {
                    newChar = encodeArrayUpper[(i+2) % 26];
                }
            }
        }

        else if(encodeMapLower.indexOf(currentChar) != -1)
        {
            for( i = 0; i &lt; encodeArrayLower.length; i++)
            {
                if(currentChar == encodeArrayLower[i])
                {
                    newChar = encodeArrayLower[(i+2) % 26];
                }
            }
        }

        else if(encodeMapNumber.indexOf(currentChar) != -1)
        {
            for( i = 0; i &lt; encodeArrayNumber.length; i++)
            {
                if(currentChar == encodeArrayNumber[i])
                {
                    newChar = encodeArrayNumber[(i+2) % 10];
                }

            }
        }
        else
        {
            //element is a special character
            newChar = currentChar;
        }

        return newChar;
    }

    public static char backMap(char currentChar)
    {
        char newChar = ' ';
        int i = 0;

        String decodeMapUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String decodeMapLower = "abcdefghijklmnopqrstuvwxyz";
        String decodeMapNumber = "0123456789";

        char[] decodeArrayUpper = decodeMapUpper.toCharArray();
        char[] decodeArrayLower = decodeMapLower.toCharArray();
        char[] decodeArrayNumber = decodeMapNumber.toCharArray();

        if (decodeMapUpper.indexOf(currentChar) != -1)
        {
            for (i=0; i &lt; decodeArrayUpper.length; i++)
            {
                if (currentChar == decodeArrayUpper[i])
                {
                    newChar = decodeArrayUpper[(i - 2) % 26];
                }
            }
        }

        else if(decodeMapLower.indexOf(currentChar) != -1)
        {
            for (i=0; i &lt; decodeArrayLower.length; i++)
            {
                if (currentChar == decodeArrayLower[i])
                {
                    newChar = decodeArrayLower[(i - 2) % 26];
                }
            }
        }

        else if(decodeMapNumber.indexOf(currentChar) != -1)
        {
            for (i=0; i &lt; decodeArrayNumber.length; i++)
            {
                if (currentChar == decodeArrayNumber[i])
                {
                    newChar = decodeArrayNumber[(i - 2) % 10];
                }
            }
        }   

        else
        {
            newChar = currentChar;
        }
        return newChar;
    }
    //get methods
    public String[] getEncodedList() { return encodedList;}
        public String[] getDecodedList() { return decodedList;}

}
</code></pre>

<p>This is the tester class bellow just in case.</p>

<pre><code>package lab01;

public class EncodeDecodeTester 
{
    public static void main(String[] args)
    {
        EncodeDecode testEncoder;
        int x = 0;
        String[] output = new String[5];
        String[] oL = new String[] {"catdog","24","keys","Duck","PIZZA!"};


        //create encoder
        testEncoder = new EncodeDecode(oL);

        System.out.println("Encoded list:");
        for( x = 0; x &lt; output.length; x++)
        {
            output = testEncoder.getEncodedList();
            System.out.println(output[x]);
        }

        System.out.println();
        System.out.println("Decoded List:");
        for(x = 0; x &lt; output.length; x++)
        {
            output = testEncoder.getDecodedList();
            System.out.println(output[x] + " ");
        }
        System.out.println();

        System.out.println("End");
    }
}
</code></pre>

<p>Please help I am completely lost for words on what I did wrong here.</p>
