我收到了这个错误,但它没有帮助,因为它没有指出我发生错误的地方。错误后的数字是什么意思?我一直在查看过去几个小时的错误,但我并没有真正得到错误的来源。我的代码是:
val str = "(and x y)";
def stringParse ( exp: String, expreshHolder: ArrayBuffer[String] ): ArrayBuffer[String] = { //takes three arguments, string, int, arraybuffer
var b = 0; //position of where in the expression String I am currently in
var temp = expreshHolder; //holder of expressions without parens
if(temp == 0) b = 0; else {b = temp(temp.length-1).toInt; temp.remove(temp.length-1)} //this sets the position of wherever the string was read last plus removes that check from the end of the ArrayBuffer
var arrayCounter = temp.length; //just counts to make sure an empty spot in the array is there to put in the strings
if(exp(b) == '(') {
b = b + 1;
while(exp(b) == ' '){b = b + 1;} //point of this is to just skip any spaces between paren and start of expression type
if(exp(b) == 'a') {
//first create the 'and', 'or', 'not' expression types to figure out
temp += exp(b).toString;
b = b+1;
temp(arrayCounter) = temp(arrayCounter) + exp(b).toString; //concatenates the second letter
b = b+1;
temp(arrayCounter) = temp(arrayCounter) + exp(b).toString; //concatenates the last letter for the expression type
arrayCounter+=1
//this part now takes the symbols and puts them in an array
b+=1;
while(exp(b) == ' ') {b+=1;} //just skips any spaces until it reaches the first symbol
if(exp(b) == '(') { temp += b.toString; temp = stringParse(exp, temp);
b = temp(temp.length-1).toInt;
temp.remove(temp.length-1);
arrayCounter = temp.length
} else {
temp += exp(b).toString;
arrayCounter+=1; b+=1; }
while(exp(b) == ' ') {b+=1;} //just skips any spaces until it reaches the second symbol
if(exp(b) == '(') { temp += b.toString; temp = stringParse(exp, temp);
b = temp(temp.length-1).toInt;
temp.remove(temp.length-1);
arrayCounter = temp.length } else {temp += exp(b).toString; arrayCounter+=1; b+=1; }
}
temp;
} else {
temp(arrayCounter) +="failed"; temp;} //this is just incase it fails and I should probably check this incase it fails when it doesnt encounter an opening paren
}//end of while loop
hold = stringParse(str, ho );
for(test <- hold) println(test);
很抱歉代码的数量,但我可以告诉它是正确的。这段代码的重点是读取顶部的第一个字符串,然后将“and”,“x”,“y”放在数组中。它假设在更复杂的版本上执行它,但我首先尝试在一个简单的版本上测试并确保它的工作原理。我得到的错误是:
java.lang.ArrayIndexOutOfBoundsException: -1
at scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:45)
at scala.collection.mutable.ArrayBuffer.apply(ArrayBuffer.scala:44)
at Driver$.stringParse$1(Driver.scala:19)
at Driver$.main(Driver.scala:60)
at Driver.main(Driver.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78)
at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88)
at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:56)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
能否阅读此错误消息并了解其发生的任何帮助?提前谢谢。
答案 0 :(得分:6)
这意味着您正在递减的变量已达到-1
另请注意,您只需按照行号进行操作即可。例如,首先要看的是'45'行
scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:45)
解决你先写的方法。
答案 1 :(得分:6)
错误发生在Driver.scala
的第19行:
at Driver$.stringParse$1(Driver.scala:19)
带上一只雄鹅:
if(temp == 0) b = 0; else {b = temp(temp.length-1).toInt; temp.remove(temp.length-1)}
temp
是ArrayBuffer[String]
,而非数字,因此temp == 0
始终为false。这意味着else
子句将始终执行,即使temp.length
为0。