0

我正在制作一个密码,由于某种原因,它在我输入文本后给了我这些错误:

enter string to be encrypted: 
hello world
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
    at chipher.cipher.encrypt(cipher.java:21)
    at chipher.cipher.main(cipher.java:9)

这是我的代码:

package chipher;
import java.util.Scanner;
public class cipher {
public static int x;
public static int y;
public static Scanner jon = new Scanner(System.in);
    public static void main(String[] args) {
        System.out.println("enter string to be encrypted: ");
        encrypt(jon.nextLine());
        }


public static void encrypt(String tocipher){
    double lngth = tocipher.length();
    tocipher.toLowerCase();
    char[] mynamechars = tocipher.toCharArray();
    char[] alphabet = new char[]{'a', 'b', 'c', 'd' , 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
for(int i = 0; i<lngth;)
    for(int x = 0; x<26;){
        y = x + 1;
if(mynamechars[i] == alphabet[x]){
    mynamechars[i] = alphabet[y];
}
i++;
x++;
}
    String text = String.valueOf(mynamechars);
    System.out.println(text);
}
}

我不知道发生了什么,我只是在学习 Java,所以它可能是一些基本的东西,所以请耐心等待。

4

3 回答 3

0

你在做

mynamechars[i]

最多第 25 个索引,您输入的输入似乎只有 10 个字符长

于 2013-07-18T23:59:30.303 回答
0

你有两个错误。你的第一个是由于你编写for循环的方式和你没有缩进:

for (int i = 0; i < lngth;) {
    for (int x = 0; x < 26;) {
        y = x + 1;

        if (mynamechars[i] == alphabet[x]) {
            mynamechars[i] = alphabet[y];
        }

        i++;
        x++;
    }

    String text = String.valueOf(mynamechars);
    System.out.println(text);
}

i在内部循环中与x. 您应该在该循环之外增加它:

for (int i = 0; i < lngth; i++) {
    for (int x = 0; x < 26; x++) {
        y = x + 1;

        if (mynamechars[i] == alphabet[x]) {
            mynamechars[i] = alphabet[y];
        }
    }

    String text = String.valueOf(mynamechars);
    System.out.println(text);
}

那么问题来了y

x范围从025,所以y范围从126alphabet没有索引为26(即第 27字母)的元素,这会导致您的错误。

您要么必须手动检查这种情况:

if (mynamechars[i] == alphabet[x]) {
    if (y == 26) {
        y = 0;
    }

    mynamechars[i] = alphabet[y];
}

或者完全摆脱y并使用模运算符环绕到开头:

if (mynamechars[i] == alphabet[x]) {
    mynamechars[i] = alphabet[(x + 1) % alphabet.length];
}
于 2013-07-19T00:01:31.877 回答
0

System.out.println在上面添加一个y = x + 1;,您应该了解异常的含义:)

于 2013-07-19T00:03:04.267 回答