Строковой калькулятор, проблема с операциями при сложение строк (java)

Подскажите пожалуйста при вводе строки с помощью Scanner к примеру "Привет/" + "мир" я получаю следующую ошибку:

Введите любую строку: "Привет/" + "мир" Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1 at CalculatorString.calculateStringResult(CalculatorString.java:42) at CalculatorString.main(CalculatorString.java:10)

Process finished with exit code 1

Проблема в том, что я складываю две строки массива, разделение должен быть по " + ", а получил разделение по / который стоит после слова Привет -> "Привет/". Как лучше исправить эту проблему? Изменить во всех кейсах разделитель? Или можно как то игнорировать каким-то методом лишние знаки +, -, / и * которые могут попасть в первую или вторую строку над которыми нужно провести операцию.

Буду благодарен за совет по улучшению кода!


public class CalculatorString {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Введите любую строку: ");
        String string = scanner.nextLine();
        string = string.replace("\"", "").trim();
        try {
            System.out.println(calculateStringResult(string));
        } catch (NumberFormatException e) {
            System.err.println("Нельзя число делить и умножать на строку!");
        }
    }

    public static String calculateStringResult(String stringResult) throws NumberFormatException{
        StringBuilder modifiedStr = new StringBuilder();
        char symbol;
        char firstSymbol;
        char lastSymbol;
        String[] arrString;
        int elementsArrString;

        for (int i = 0; i < stringResult.length(); i++) {
            symbol = stringResult.charAt(i);
            firstSymbol = stringResult.charAt(0);
            lastSymbol = stringResult.charAt(stringResult.length() - 1);

            switch (symbol) {
                case '+':
                    arrString = stringResult.trim().split(" \\+ ");
                    if (arrString[0].length() > 10 || arrString[1].length() > 10) {
                        System.err.println("Одна из строк превышает допустимую длинну 10 символов");
                    } else if (Character.isDigit(firstSymbol) || Character.isDigit(lastSymbol)) {
                        System.err.println("Первый или последний аргумент не должен быть числом!");
                    } else {
                        modifiedStr.append(arrString[0].concat(arrString[1])).insert(0, "\"").insert(modifiedStr.length(), "\"");
                    }
                    break;
                case '/':
                    arrString = stringResult.trim().split(" / ");
                    elementsArrString = Integer.parseInt(arrString[1]);
                    if (arrString[0].length() > 10) {
                        System.err.println("Одна из строк превышает допустимую длинну 10 символов");
                    } else if (Character.isDigit(firstSymbol)) {
                        System.err.println("Первый аргумент не должен быть числом!");
                    } else if (elementsArrString < 0 || elementsArrString > 10) {
                        System.err.println("Число должно быть от 1 до 10");
                    } else {
                        for (int j = 0; j < arrString[0].length() / elementsArrString; j++) {
                            symbol = arrString[0].charAt(j);
                            modifiedStr.append(symbol);
                        }
                        modifiedStr.insert(0, "\"").insert(modifiedStr.length(), "\"");
                    }
                    break;
                case '*':
                    arrString = stringResult.trim().split(" \\* ");
                    elementsArrString = Integer.parseInt(arrString[1]);

                    if (arrString[0].length() > 10) {
                        System.err.println("Одна из строк превышает допустимую длинну 10 символов");
                    } else if (elementsArrString < 0 || elementsArrString > 10) {
                        System.err.println("Число должно быть от 1 до 10");
                    } else if (Character.isDigit(firstSymbol) || !Character.isDigit(lastSymbol)) {
                        System.err.println("Первый аргумент не должен быть числом!");
                    } else {
                        modifiedStr = new StringBuilder(elementsArrString * arrString[0].length());
                        modifiedStr.append(arrString[0].repeat(elementsArrString)).insert(0, "\"").insert(modifiedStr.length(), "\"");
                    }
                    break;
                case '-':
                    arrString = stringResult.trim().split(" - ");
                    elementsArrString = arrString[0].indexOf(arrString[1]);
                    if (arrString[0].length() > 10 || arrString[1].length() > 10) {
                        System.err.println("Одна из строк превышает допустимую длинну 10 символов");
                    } else if (Character.isDigit(firstSymbol) || Character.isDigit(lastSymbol)) {
                        System.err.println("Оба аргумента должны быть строками!");
                    } else {
                        if (elementsArrString == -1) {
                            modifiedStr.append(arrString[0]);
                        } else {
                            String oneStrMinusSecondStr = arrString[0].substring(0, elementsArrString);
                            oneStrMinusSecondStr += arrString[0].substring(elementsArrString + arrString[1].length());
                            modifiedStr.append(oneStrMinusSecondStr).insert(0, "\"").insert(modifiedStr.length(), "\"");
                        }
                    }
                    break;
            }
        }

        if (modifiedStr.length() > 40) {
            String endStr = "..." + "\"";
            return modifiedStr.insert(0, "\"").substring(0, 40).concat(endStr);
        } else {
            return modifiedStr.toString().trim();
        }
    }
}```

Ответы (1 шт):

Автор решения: talex moved to Codidact

Добавить

case '"': 
    i++;
    while(stringResult.charAt(i) !='"' && i < stringResult.length()) {i++;}
    break;

но в целом все написано неправильно. Подробнее раскажут в Code Review.

→ Ссылка