Цезарь, шифрование. Массив вне границ в индексе 73 из 73 - PullRequest
0 голосов
/ 22 января 2020

Я работаю над кодом шифрования цезаря для презентации по математике. Сегодня я кодировал для своей презентации. Утром этот код работал. Но теперь в школе я получаю исключение, которое говорит, я думаю, что for имеет значение для длины моей таблицы символов.

Исключение:

Исключение в потоке «AWT-EventQueue-0» java .lang.ArrayIndexOutOfBoundsException: индексировать 73 за пределами длины 73 в caesarForm.decrypt (caesarForm. java: 81)

Строка 81 - третья for in decrypt()

Я был бы рад, если бы кто-то мог просмотреть мой код, потому что я, с моим 3-месячным опытом кодирования, не могу понять, что происходит.

//Alphanumeric table
    final static char[] symbs = new char[] {'.',',','1','2','3','4','5','6','7','8','9','0','/','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a',' '
                    ,'ß','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','ä','ö','ü','Ü','Ö','Ä'};
    final static int charlength = 73;

    //var global key
    int key = 0;

    //en- and decryption vars
    char[] letters = new char[255];
    char[] storg = new char[255];
    char[] sterg = new char[255];
    StringBuilder str = new StringBuilder();
    int cnt = 0;
    int cnt2 = 0;
    int c = 0;
    String bakToStr;

textField1.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
                char iNumber = e.getKeyChar();
                if (!(Character.isDigit(iNumber))
                        || iNumber == KeyEvent.VK_BACK_SPACE
                        || iNumber == KeyEvent.VK_DELETE) {
                    e.consume();
                    JOptionPane.showMessageDialog(contentPane, "Nur Zahlen werden als schlüssel akzeptiert", "Achtung!", JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });

public String encrypt(String Text) {
        letters = new char[255];
        storg = new char[255];
        sterg = new char[255];
        str = new StringBuilder();
        cnt = 0;
        cnt2 = 1;
        c = 0;
        bakToStr = "";
        for (int i = 0; i <Text.length(); i++) {
            letters[i] = Text.charAt(i);
        }
        for (; cnt < Text.length(); cnt++) {
            for (;letters[cnt] != symbs[cnt2];cnt2++) {
            }
            c = (cnt2 + key) %charlength;
            storg[cnt] = symbs[c];
            cnt2 = 0;
        }
        str.append(storg);
        bakToStr = String.valueOf(str);
        return bakToStr;
    }

    public String decrypt(String Text) {
        letters = new char[255];
        storg = new char[255];
        sterg = new char[255];
        str = new StringBuilder();
        cnt = 0;
        cnt2 = 1;
        c = 0;
        bakToStr = "";
        for (int i = 0; i <Text.length(); i++) {
            letters[i] = Text.charAt(i);
        }
        for (; cnt < Text.length(); cnt++) {
            for (;letters[cnt] != symbs[cnt2];cnt2++) {
            }
            c = (cnt2 - key) %charlength;
            while (c <= 0) {
                c += charlength;
            }
            storg[cnt] = symbs[c];
            cnt2 = 0;
        }
        str.append(storg);
        bakToStr = String.valueOf(str);
        return bakToStr;
    }

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Я нашел проблему:

StringBuilder str = new StringBuilder();

Не знаю почему, но без Stringbuilder у меня больше не возникает проблем.

Спасибо Мохаммеду и @MadProgrammer за попытку помочь:)

Привет, казах.

0 голосов
/ 22 января 2020

Пожалуйста, рассмотрите эту строку:

while (c <= 0) {
    c += charlength;
}

Что будет, если c==0? Я думаю, что он будет прыгать до 73, что charlength. Таким образом, лучший способ здесь состоит в том, чтобы сделать условие while (c < 0) вместо while (c <= 0).

Однако, я думаю, что основная проблема заключается в этом третьем для l oop:

for (;letters[cnt] != symbs[cnt2];cnt2++)

, поскольку cnt2 инициализируется значением 1 (не 0) и увеличивается. Если условие не выполняется, то cnt2 всегда будет увеличиваться, поэтому оно становится 73 и выдает исключение indexOutOfBound.

Надеюсь, это поможет:)

...