为什么while循环调转顺序就会报错

问题遇到的现象和发生背景

第23行将i<s.length()放到 (c=s.charAt(i))>= 48 && (c=s.charAt(i)) <= 57后面就会报错,放到前面就能正常运行,没有想明白为什么会这样

问题相关代码,请勿粘贴截图
package 栈;

import java.util.ArrayList;
import java.util.List;

public class PolandNotation {
    public static void main(String[] args) {
        List<String> infixExpression = toInfixExpression("3+4*50-6");
        System.out.println(infixExpression);
    }

    public static List<String> toInfixExpression(String s) {
        List<String> ls = new ArrayList<>();
        String str;
        int i = 0;
        char c;
        do {
            if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {
                ls.add("" + c);
                i++;
            } else {
                str ="";
                while ( i<s.length() &&  (c=s.charAt(i))>= 48 && (c=s.charAt(i)) <= 57 ){
                    str += c;
                    i++;
                }
                ls.add(str);
            }
        } while (i < s.length());
        return ls;
    }
}


class operation{
    private static int ADD=1;
    private static int SUB=1;
    private static int MUL=2;
    private static int DIV=2;

    public static int getVaule(String operation){
        int result=0;
        switch(operation){
            case "+":
                result=ADD;
                break;
            case  "-":
                result=SUB;
                break;
            case "*":
                result=MUL;
                break;
            case "/":
                result=DIV;
                break;
            default:
                System.out.println("不存在该运算符" + operation);
                break;
        }
        return result;
    }



}

运行结果及报错内容

img

img

我的解答思路和尝试过的方法
我想要达到的结果

&&是逻辑与,有短路特性
当前面的条件不满足,将不继续执行后续的判断
当i<s.length(),说明索引没有溢出,才可以继续进行后续的判断
你不先判断索引溢出不溢出,那就会造成索引溢出,或者叫数组越界

第23行将i<s.length()放到 (c=s.charAt(i))>= 48 && (c=s.charAt(i)) <= 57后面就会报错,放到前面就能正常运行

因为java 条件执行是断路执行,前面条件能满足,后面就不执行了,所以不会报错哈。

望采纳,谢谢!不清楚可以再问

因为&&是前面为false,后面的代码就直接不执行了,
如果i<s.length()放到后面,当执行到最后一位后i++,while执行c=s.charAt(i)这个语句就会超出索引,所以报错