variable1.indexOf(variable2.charAt(i))超出范围的异常

时间:2014-12-12 16:56:25

标签: java

这是我的学校作业,我应该创建一个编码器。用户输入包含在变量“key”中的加密密钥,加密密钥的示例是“abc”。使用字母表,我应该根据字母顺序添加用户输入的键中的字母。例如,键“abc”应该加到6.因此,根据字母“a”的顺序为1,b = 2,c = 3,所以1 + 2 + 3 = 6.

现在对于这个错误,每当我尝试添加alphabet.indexOf(key.charAt(i))时,它都会给出一个超出范围的异常。我该如何解决这个问题?

 35   public static int option1(String input, String alphabet, String key)
 36     {
 37       
 38       int sum = 0;
 39         
 40       for (int i = 0; i < alphabet.length(); i++)
 41       { 
 42         
 43           **sum = sum + alphabet.indexOf(key.charAt(i));**
 44           
 45         }
 46                  
 47       System.out.println(sum);
 48        return sum;
 49     }

这给出了错误

java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.charAt(Unknown Source)
    at Encryption.option1(Encryption.java:43)
    at Encryption.main(Encryption.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

错误是sum语句,我使用另一个变量的字母添加字母表中某个字母的索引。为什么这会给出界外例外?怎么修好?

3 个答案:

答案 0 :(得分:1)

如果您拥有密钥abc,则可以将其分解为a[0] b[1] c[2],因此当您到达for时,i == 3循环会超出您的范围键。因此,您需要更改for循环以使用key.length()而不是alphabet.length(),如下所示:

for (int i = 0; i < key.length(); i++)
{     
    sum = sum + alphabet.indexOf(key.charAt(i));        
}

答案 1 :(得分:0)

我猜你的意思是在for循环中使用key.length()。

我想我也会在这里发表评论:

如果你输入“abc”,你的“key”字符串只有长度为3 ...但是你在循环中使用长度为26的“alphabet”长度。这会导致尝试抓取任何字符时出错在你的字符串“key”的第3个位置之后

 35   public static int option1(String input, String alphabet, String key)
 36     {
 37       
 38       int sum = 0;
 39         
 40       for (int i = 0; i < key.length(); i++)
 41       { 
 42         
 43           **sum = sum + alphabet.indexOf(key.charAt(i));**
 44           
 45         }
 46                  
 47       System.out.println(sum);
 48        return sum;
 49     }

答案 2 :(得分:0)

上述答案也暗示了这一点,但重要的是要注意,当创建String时,它实际上会创建对1-D数组的引用。在创建或使用字符串时,最好考虑创建数组的大小而不是字符串的大小(尽管在很多情况下这是可以互换的)。这样你就可以避免任何&#34; ArrayOutOfBounds&#34;将来出现的例外情况。