Java解释器索引超出范围

Java解释器索引超出范围,java,parsing,interpreter,Java,Parsing,Interpreter,嘿,我正在编写一个递归函数parseString(strings),它接受一个前缀表达式,比如“+2 2”,并从中创建一个表达式树。例如,当将“+2 2”赋给parseString()时,“+”返回一个AddExpression(left,right),其中left和right都是parseString(s.substring(++i)),这样在对left求值后,i将更大,并且只保留右侧的子字符串。问题是i正在对原始字符串进行索引,这意味着它最终大于子字符串的长度,编译器抛出超出范围的异常。下面

嘿,我正在编写一个递归函数
parseString(strings)
,它接受一个前缀表达式,比如“+2 2”,并从中创建一个表达式树。例如,当将“+2 2”赋给parseString()时,“+”返回一个AddExpression(left,right),其中left和right都是
parseString(s.substring(++i))
,这样在对left求值后,
i
将更大,并且只保留右侧的子字符串。问题是
i
正在对原始字符串进行索引,这意味着它最终大于子字符串的长度,编译器抛出
超出范围的
异常。下面是一段
parseString()
代码,其中只有add操作可以理解我的意思:

public static Expression parseString(String s) {
    if (s.length() == 0) return null;
    else {

        /*ADDITION*/
        if (s.charAt(i) == '+') {
            return new AddExpression( parseString(s.substring(++i)), parseString(s.substring(++i)) );
        }

        /*LITERALS*/
        else {
            int j = i;
            while (i < s.length() && s.charAt(i) != ' ') { // find the end of the number
                i++;
            }
            return new IntExpression(s.substring(j, i));
        }
    }
} // parseString
公共静态表达式解析字符串(字符串s){
如果(s.length()==0)返回null;
否则{
/*加成*/
如果(s.charAt(i)='+'){
返回新的AddExpression(parseString(s.substring(++i)),parseString(s.substring(++i));
}
/*文字*/
否则{
int j=i;
while(i

是否有任何方法可以将整个字符串保留在索引中。。。以某种方式(parseString必须只接受1个参数),或者在计算左侧后重置i,或者做什么?

您可以这样做,只需在其上构建一个示例:

public static Expression parseString(String s) {
    if (s.length() == 0) return null;
    else {

        /*ADDITION*/
        if (s.charAt(0) == '+') {
            Expression left = parseString(s.substring(1));
            Expression right = parseString(s.substring(left.length() +1)); //where length should return expressions length
            return new AddExpression( left, right );
        }

        /*LITERALS*/
        else {
            int i=0;
            while (i < s.length() && s.charAt(i) != ' ') { // find the end of the number
                i++;
            }
            return new IntExpression(s.substring(0, i));
        }
    }
} 
公共静态表达式解析字符串(字符串s){
如果(s.length()==0)返回null;
否则{
/*加成*/
如果(s.charAt(0)='+'){
表达式left=parseString(s.substring(1));
表达式right=parseString(s.substring(left.length()+1));//其中length应返回表达式length
返回新的AddExpression(左、右);
}
/*文字*/
否则{
int i=0;
while(i
在parseString方法中声明i,每次调用parseString时,参数中都有一个新字符串,因此索引应该为零。为什么不能添加第二个带有两个参数的
parseString
方法?还有,我想你应该查一下。@fmodos我试过了,觉得很奇怪results@ElliottFrisch这只是作业要求的一部分检查
i+1
小于
s.length()(和
i+2
)。