2012-04-04 97 views
0

我收到了这个错误,但它并不是非常有用,因为它并没有将我指向发生错误的地方。错误之后的数字意味着什么?我一直在查看过去几个小时的错误,但我并没有真正知道错误来自哪里。我的代码是:Scala中的“java.lang.ArrayIndexOutOfBoundsException:-1”中的数字意味着什么?

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); 

对不起,代码量不大,但从我能告诉它是正确的。这段代码的重点在于读取顶部的第一个字符串,并将“和”,“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) 

任何帮助能够读取此错误消息,并了解它发生的地方?提前致谢。

+1

错误表示您的程序尝试去数组中的负第一个索引,即'myArray [-1]',这不可能为0是数组中最低的索引。 – 2012-04-04 23:48:35

回答

6

这意味着你正在递减变量已达到-1

另外请注意,所有你需要做的就是按照行号。例如,首先看的是'45'行

scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:45) 

解决您先写的方法。

+0

嗯,我认为数字意味着什么,因为也有行不存在。但是我看了,它不应该达到负面。至少这是方法 – Andy 2012-04-05 00:08:05

+0

第一次检查的全部内容,我非常感谢帮助。 – Andy 2012-04-05 00:54:55

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)} 

tempArrayBuffer[String],不是一个数字,所以temp == 0永远是假的。这意味着else子句将始终执行,即使temp.length为0时也是如此。

+0

谢谢!我也注意到了它。但是我的代码至少有很多糟糕的代码。一定要修复错误。 – Andy 2012-04-05 01:11:21

+0

尽管你说了什么,但我得到了其他部分的错误。我的下一个例子是“(和x(和y z))”。当它运行时,它遇到了z的问题,所以我认为y已经过去了。你想也许你可以看看为什么它给了我这个错误? – Andy 2012-04-05 01:27:15

+0

@Andy:你得到'java.lang.NumberFormatException:对于输入字符串:“z” ...在Driver $ .stringParse $ 1(Temp.scala:47)'因为在第47行,你尝试转换最后一件事你的'ArrayBuffer [String]'堆栈到一个索引中,但是你最后推入堆栈的是“z”(在第49行 - “temp + = exp(b).toString”)。 – rampion 2012-04-05 18:21:01