Java 多密钥Caesar密码可能存在无限循环错误

Java 多密钥Caesar密码可能存在无限循环错误,java,queue,encode,caesar-cipher,Java,Queue,Encode,Caesar Cipher,这个程序可以编译,但在我输入各个键值之后,程序不会输出任何东西(没有错误),并且有效地结束。它应该使用键值列表将每个字符移动不同的量。例如,如果键值为3 1 7-4 2 5,则第一个字符移位3,第二个字符移位1,依此类推(在ASCII字符表上)。将第六个字符移动5后,我再次开始使用该键。我已经为队列接口实现了一个节点和队列类 这是我的班级: public class Cipher { public static void main(String[] args) {

这个程序可以编译,但在我输入各个键值之后,程序不会输出任何东西(没有错误),并且有效地结束。它应该使用键值列表将每个字符移动不同的量。例如,如果键值为3 1 7-4 2 5,则第一个字符移位3,第二个字符移位1,依此类推(在ASCII字符表上)。将第六个字符移动5后,我再次开始使用该键。我已经为队列接口实现了一个节点和队列类

这是我的班级:

public class Cipher
{
    public static void main(String[] args)
    {
        Scanner kb = new Scanner(System.in);
        Queue keys = new Queue();
        int n;
    String answer, message, encrypted = "", decrypted = "";

        do
        {
            System.out.println("Enter the number of key values:");
            n = kb.nextInt();

            System.out.println("Enter the individual key values:");

            while (kb.hasNextInt())
                keys.enqueue((Integer)kb.nextInt());

            int initial = Integer.parseInt((String)keys.peek());

            System.out.println("Enter a string to be encoded:");
            message = kb.nextLine();

            for(int j=0; j < message.length(); j++)
            {
                keys.enqueue(keys.peek());
                encrypted += encode(message.charAt(j), Integer.parseInt((String)keys.dequeue()));
            }

            System.out.println("The encoded message is: " + encrypted);

            while (Integer.parseInt((String)keys.peek()) != initial)
            {
                keys.enqueue(keys.peek());
                keys.dequeue();
            }

            for(int k = 0; k < message.length(); k++)
            {
                keys.enqueue(keys.peek());
                decrypted += decode(message.charAt(k), Integer.parseInt((String)keys.dequeue()));
            }

            System.out.println("The decoded message is:" + decrypted);
            System.out.println("Would you like to run the program again? (yes/no)");
            answer = kb.nextLine();
        }
        while (answer.equalsIgnoreCase("yes"));
    }

    public static String decode(char enc, int offset) {
        return encode(enc, 26-offset);
    }

    public static String encode(char enc, int offset) {
        offset = offset % 26 + 26;
        StringBuilder encoded = new StringBuilder();
        if (Character.isUpperCase(enc)) {
                encoded.append((char) ('A' + (enc - 'A' + offset) % 26 ));
                }
         else {
                encoded.append((char) ('a' + (enc - 'a' + offset) % 26 ));
                }
        return encoded.toString();
    }
}

它可以自己调试一点。使用deque作为一个简单的循环缓冲区类似于用热核武器杀死蚊子(也就是说,可能会起作用(除非是朝鲜),但这是严重的过度杀灭)。现在,如果我能让自己关心Java,我可能会提供一个答案:-)你有一个有趣的情况;您引用了ASCII字符集,但正在编写一个
encode
函数,该函数采用
char
,这是一个UTF-16代码单元。UTF-16是字符集的一种编码。参数验证用于为算法可接受的数据范围提供边界。考虑,<代码>如果(字符).UnoDeBoLo.Basic拉丁语。代码>
System.out.println("Enter the individual key values:");

            while (kb.hasNextInt())
                keys.enqueue((Integer)kb.nextInt());

            int initial = Integer.parseInt((String)keys.peek());