这是我的学校作业,我应该创建一个编码器。用户输入包含在变量“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语句,我使用另一个变量的字母添加字母表中某个字母的索引。为什么这会给出界外例外?怎么修好?
答案 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;将来出现的例外情况。