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()在调用子字符串之前,先执行code>(和i+2
)。