0

It builds without a problem, but when I plug in the phrase it gives me the following error in the general output box:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
    at java.lang.String.charAt(String.java:686)
    at encoder.main(encoder.java:77)

Process completed.

Can anyone tell me what the problem is and how to fix it?

Here is the code:

/**
 * @(#)encoder.java
 *
 *
 * @author Armando Herrera
 * @version Alpha Encoder 0.1 2011/4/9
 */
import javax.swing.*;
import java.lang.*;
import java.util.*;

public class encoder {

    /**
     * Creates a new instance of <code>encoder</code>.
     */
    public encoder() {
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String strencodersequense = JOptionPane.showInputDialog("Input a 9 digit number");///ask for sequenser///
        int digitlength = strencodersequense.length();
        if(digitlength != 9)
        {
            JOptionPane.showMessageDialog(null, "The number you entered is not desired lenght.");/////check if they put number of digits
            System.exit(0);
        }
        ///////////////////////////split the codersequense into char parts/////////////////////////////
        char firstdigitchar = strencodersequense.charAt(0);
        char seconddigitchar = strencodersequense.charAt(1);
        char thirddigitchar = strencodersequense.charAt(2);
        char fourthdigitchar = strencodersequense.charAt(3);
        char fifthdigitchar = strencodersequense.charAt(4);
        char sixthdigitchar = strencodersequense.charAt(5);
        char seventhdigitchar = strencodersequense.charAt(6);
        char eightdigitchar = strencodersequense.charAt(7);
        char ninthdigitchar = strencodersequense.charAt(8);
        //////////////////////////change split chars to strings///////////////////////////////////////
        String firstdigitstr = Character.toString(firstdigitchar);
        String seconddigitstr = Character.toString(seconddigitchar);
        String thirddigitstr = Character.toString(thirddigitchar);
        String fourthdigitstr = Character.toString(fourthdigitchar);
        String fifthdigitstr = Character.toString(fifthdigitchar);
        String sixthdigitstr = Character.toString(sixthdigitchar);
        String seventhdigitstr = Character.toString(seventhdigitchar);
        String eightdigitstr = Character.toString(eightdigitchar);
        String ninthdigitstr = Character.toString(ninthdigitchar);
        //////////////////////////change split strings into integers///////////////////////////////////////
        int firstdigitint = Integer.parseInt(firstdigitstr);
        int seconddigitint = Integer.parseInt(seconddigitstr);
        int thirddigitint = Integer.parseInt(thirddigitstr);
        int fourthdigitint = Integer.parseInt(fourthdigitstr);
        int fifthdigitint = Integer.parseInt(fifthdigitstr);
        int sixthdigitint = Integer.parseInt(sixthdigitstr);
        int seventhdigitint = Integer.parseInt(seventhdigitstr);
        int eightdigitint = Integer.parseInt(eightdigitstr);
        int ninthdigitint = Integer.parseInt(ninthdigitstr);
        /////////////////////////////////finished processing sequense//////////////////////////////////////
        String toencode = JOptionPane.showInputDialog("Input phrase to encode, with no special characters and in lower caps" + 
                                                        " Note: it will not work with special characters.");//////asked phrase/////
        int toencodelenght = toencode.length();///get phrase lenght
        int passcode = firstdigitint * seconddigitint * thirddigitint * fourthdigitint * fifthdigitint *
                       sixthdigitint * seconddigitint * eightdigitint * ninthdigitint; ////make a combination of the digits////
        ////////////////////////////turn string into numbers////////////////////////////////////////////////////////////////////////////////////////

        int i = 0;

        char[] toencodecharacter = new char[toencodelenght];///start (making arrays)
        String[] toencodestringchar = new String[toencodelenght];
        int[] beforeencodenumber = new int[toencodelenght];
        int[] afterencodenumber = new int[toencodelenght];

        while(i <= toencodelenght)
            {
            toencodecharacter[i] = toencode.charAt(i); //////split characters//////
            toencodestringchar[i] = Character.toString(toencodecharacter[i]);
            if(toencodestringchar[i].equals("a")) //process the characters individually
                {
                    beforeencodenumber[i] = 1;
                }
            if(toencodestringchar[i].equals("b"))
                {
                    beforeencodenumber[i] = 2;
                }
            if(toencodestringchar[i].equals("c"))
                {
                    beforeencodenumber[i] = 3;
                }
            if(toencodestringchar[i].equals("d"))
                {
                    beforeencodenumber[i] = 4;
                }
            if(toencodestringchar[i].equals("e"))
                {
                    beforeencodenumber[i] = 5;
                }
            if(toencodestringchar[i].equals("f"))
                {
                    beforeencodenumber[i] = 6;
                }
            if(toencodestringchar[i].equals("g"))
                {
                    beforeencodenumber[i] = 7;
                }
            if(toencodestringchar[i].equals("h"))
                {
                    beforeencodenumber[i] = 8;
                }
            if(toencodestringchar[i].equals("i"))
                {
                    beforeencodenumber[i] = 9;
                }
            if(toencodestringchar[i].equals("j"))
                {
                    beforeencodenumber[i] = 10;
                }
            if(toencodestringchar[i].equals("k"))
                {
                    beforeencodenumber[i] = 11;
                }
            if(toencodestringchar[i].equals("l"))
                {
                    beforeencodenumber[i] = 12;
                }
            if(toencodestringchar[i].equals("m"))
                {
                    beforeencodenumber[i] = 13;
                }
            if(toencodestringchar[i].equals("n"))
                {
                    beforeencodenumber[i] = 14;
                }
            if(toencodestringchar[i].equals("o"))
                {
                    beforeencodenumber[i] = 15;
                }
            if(toencodestringchar[i].equals("p"))
                {
                    beforeencodenumber[i] = 16;
                }
            if(toencodestringchar[i].equals("q"))
                {
                    beforeencodenumber[i] = 17;
                }
            if(toencodestringchar[i].equals("r"))
                {
                    beforeencodenumber[i] = 18;
                }
            if(toencodestringchar[i].equals("s"))
                {
                    beforeencodenumber[i] = 19;
                }
            if(toencodestringchar[i].equals("t"))
                {
                    beforeencodenumber[i] = 20;
                }
            if(toencodestringchar[i].equals("u"))
                {
                    beforeencodenumber[i] = 21;
                }
            if(toencodestringchar[i].equals("v"))
                {
                    beforeencodenumber[i] = 22;
                }
            if(toencodestringchar[i].equals("w"))
                {
                    beforeencodenumber[i] = 23;
                }
            if(toencodestringchar[i].equals("x"))
                {
                    beforeencodenumber[i] = 24;
                }
            if(toencodestringchar[i].equals("y"))
                {
                    beforeencodenumber[i] = 25;
                }
            if(toencodestringchar[i].equals("z"))
                {
                    beforeencodenumber[i] = 26;
                }
            if(toencodestringchar[i].equals(" "))
                {
                    beforeencodenumber[i] = 27;
                }
            if(toencodestringchar[i].equals("1"))
                {
                    beforeencodenumber[i] = 28;
                }
            if(toencodestringchar[i].equals("2"))
                {
                    beforeencodenumber[i] = 29;
                }
            if(toencodestringchar[i].equals("3"))
                {
                    beforeencodenumber[i] = 30;
                }
            if(toencodestringchar[i].equals("4"))
                {
                    beforeencodenumber[i] = 31;
                }
            if(toencodestringchar[i].equals("5"))
                {
                    beforeencodenumber[i] = 32;
                }
            if(toencodestringchar[i].equals("6"))
                {
                    beforeencodenumber[i] = 33;
                }
            if(toencodestringchar[i].equals("7"))
                {
                    beforeencodenumber[i] = 34;
                }
            if(toencodestringchar[i].equals("8"))
                {
                    beforeencodenumber[i] = 35;
                }
            if(toencodestringchar[i].equals("9"))
                {
                    beforeencodenumber[i] = 36;
                }
            if(toencodestringchar[i].equals("0"))
                {
                    beforeencodenumber[i] = 37;
                }
            afterencodenumber[i] = beforeencodenumber[i] * passcode;
            if(i == toencodelenght)
                {
                    String numbers = "encoded with :" + strencodersequense + ": the encoded text is :" + Arrays.toString(afterencodenumber);
                    JOptionPane.showConfirmDialog(null, numbers);
                }
            i = i + 1;
            }

        }
    }
2
  • 4
    Far too much code; it's far too literal. You need to write a lot less code and think about data structures more carefully. Commented Apr 9, 2011 at 23:06
  • @duffymo - Sometimes I have a horrible dream - that the majority of code out there in the web looks like the one above. Commented Apr 10, 2011 at 0:20

2 Answers 2

6

Try changing your while loop to be < not <=. When you are traversing an array of size length you always want to use < because the arrays are 0 indexed. If you have 9 elements, the last element is at index 8 and if you use <= in your loop, you will end up attempting to find the value at index 9 which is out of bounds.

Sign up to request clarification or add additional context in comments.

Comments

1

In this case it is a String, not an Array, but the same logic applies. The index in cahrAt is allowed to range from 0 up to, but not including the lenght of the String.

Another comment: the over 30 if-statements are horrible. I am sure there is an easy algorithm that maps this letters to numbers. Sometimes, 5 minutes of thinking will save you 1/2h of typing.

2 Comments

Even if there would not be an algorithm to calculate the number from the letter, a simple array-lookup is more easy to write.
@Paulo, Indeed! To be sure, an array is just a (partial) mapping function, doing array lookup is just applying that mapping function to a value, so I subsume that under "easy algorithm". (Sorry for being unable to replicate the accented u in your name on my keyboard - hope it makes no big difference).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.