0

このエラーが発生しますが、エラーが発生している場所の近くを示さないため、あまり役に立ちません。エラー後の数字はどういう意味ですか?過去数時間エラーを確認してきましたが、エラーの原因がわかりません。私のコードは次のとおりです。

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)

このエラーメッセージを読んで、それがどこで起こっているのかを理解できるようにするための助けはありますか?前もって感謝します。

4

2 に答える 2

6

これは、デクリメントしている変数が到達したことを意味します-1

また、必要なのは行番号に従うことだけであることに注意してください。たとえば、最初に確認する場所は「45」行です。

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

最初に書いた方法に取り組みます。

于 2012-04-04T23:53:36.700 に答える
6

エラーは次の19行目にありDriver.scalaます:

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常にfalseになります。つまり、が0elseの場合でも、句は常に実行されます。temp.length

于 2012-04-05T01:09:22.753 に答える