2011-04-09 42 views
0

它建立没有问题,但是当我插上一语中的它给我的一般输出框以下错误:问题与使用代码阵列

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. 

谁能告诉我是什么问题以及如何要解决这个问题?

下面是代码:

/** 
* @(#)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; 
      } 

     } 
    } 
+4

代码太多了;这太离谱了。您需要编写更少的代码并更仔细地考虑数据结构。 – duffymo 2011-04-09 23:06:47

+0

@duffymo - 有时我有一个可怕的梦想 - 网络中的大部分代码看起来像上面那样。 – Ingo 2011-04-10 00:20:06

回答

6

试着改变你的while循环是<<=。当您遍历一个大小为length的数组时,您总是希望使用<,因为这些数组是0索引的。如果您有9个元素,则最后一个元素位于索引8处,并且如果在循环中使用<=,则最终将尝试在索引9处查找超出范围的值。

+0

哦谢谢你,它的作品! – ggprogrammer467 2011-04-09 23:05:01

1

在这种情况下,它是一个字符串,而不是一个数组,但适用相同的逻辑。 cahrAt中的索引允许范围从0到0,但不包括字符串长度的

另一个评论:超过30个if语句是可怕的。我确信有一个简单的算法将这些字母映射到数字。有时候,5分钟的想着会节省你1/2小时的打字。

+0

即使没有算法来计算字母的数字,简单的数组查找更容易编写。 – 2011-04-10 00:36:11

+0

@Paulo,的确!可以肯定的是,一个数组只是一个(部分)映射函数,数组查找只是将该映射函数应用于一个值,所以我将其归入“简单算法”下。 (对不起,因为无法在键盘上复制名称上的重音符号 - 希望它没有太大区别)。 – Ingo 2011-04-10 00:42:41