java.lang.StringIndexOutOfBoundsException при попытке перебрать строку - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь написать приложение, которое принимает пользовательский ввод и преобразует его в азбуку Морзе

Код функции:

    public static String[] stringToMorseSequence(String stringOfLetters){
        int lenStringOfLetters = stringOfLetters.length();
        String output[] = new String[1];

        String compInterpreted = "";
        for(int i = 0; i < lenStringOfLetters; i++) {
            String focus = String.valueOf(stringOfLetters.charAt(i));
            String nextCharacter = "";
            if (i != lenStringOfLetters) {
                nextCharacter = String.valueOf(stringOfLetters.charAt(i + 1));
            } else {
                nextCharacter = "END";
            }

            if (focus == " ") {
                compInterpreted = compInterpreted + "#";
            } else {
                String morseSequence = processCharacter(focus);
                if (morseSequence == "") {

                } else if (i == lenStringOfLetters) {
                    compInterpreted = compInterpreted + "!";
                } else if (nextCharacter != "END") {
                    if (nextCharacter != " "){
                        compInterpreted = compInterpreted + morseSequence + "@";
                    } else {
                        compInterpreted = compInterpreted + morseSequence;
                    }
                }
            }
        }
        Log.i("MORSE","Computer interpretable morse sequence = " + compInterpreted);
        output[0] = compInterpreted;

        String prettySequence = "";
        for(int i = 0; i-1 < output[0].length(); i++) {
            switch(String.valueOf(output[0].charAt(i))){
                case("#"):
                    prettySequence = prettySequence + "  ";
                case("@"):
                    prettySequence = prettySequence + " ";
                default:
                    prettySequence = prettySequence + output[0].charAt(i);
            }
        }
        Log.i("MORSE","Human interpretable morse sequence = " + prettySequence);
        output[1] = prettySequence;

        return output;
    }

И, похоже, я получаю это исключение

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: me.merhlim.jessica.morsecode, PID: 5687
              java.lang.StringIndexOutOfBoundsException: length=10; index=10
                  at java.lang.String.charAt(Native Method)
                  at me.merhlim.jessica.morsecode.MorseProcessing.stringToMorseSequence(MorseProcessing.java:16)
                  at me.merhlim.jessica.morsecode.texttomorse$7.onClick(texttomorse.java:112)
                  at android.view.View.performClick(View.java:6294)
                  at android.view.View$PerformClick.run(View.java:24770)
                  at android.os.Handler.handleCallback(Handler.java:790)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:108)

Я знаю, что это логическая ошибка, но я не уверен, где эта ошибка или как ее решить.Как упоминалось в сообщении об ошибке, это ошибка индекса при попытке разобрать определенный символ в строке, но я не уверен, какая логика у меня неправильная, чтобы эта ошибка была отключена

Я новичокв Java, и это поздно ночью, так что, возможно, я просто не до конца понимаю проблему в логике, которую я пишу

Если этой информации недостаточно, чтобы ответить на мою проблему, я могу предоставить больше

Спасибо, что нашли время, чтобы прочитать это, и если вы оказываете помощь, это очень ценится -Джессика

1 Ответ

0 голосов
/ 28 декабря 2018

когда я на 9, что меньше длины 10, вызов

nextCharacter = String.valueOf(stringOfLetters.charAt(i + 1));

попытается получить символ на 10-й позиции.Однако длина строки составляет всего 10, а последний символ находится в позиции 9, что приводит к строковому индексу вне связанного исключения.Вы можете изменить это

if (i != lenStringOfLetters) {

на

if (i != lenStringOfLetters-1) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...