1
    import java.lang._

    import com.ximpleware._

    object Sample {

      def  main(args :Array[String])=  {

        // println("helloo")

         try{
             var i :Int = -1

             val vgen :VTDGen= new VTDGen()
             val ap :AutoPilot =new AutoPilot()


             ap.selectXPath("CATALOG/CD/COUNTRY/text()")
             if(vgen.parseFile("../catalog.xml", false)) {
                 val vnav :VTDNav = vgen.getNav()

                 ap.bind(vnav)

                 while((i=ap.evalXPath)!= -1) {


                  println(vnav.toString(i))
                  println(vnav.toNormalizedString(vnav.getText()))
            }

           ap.resetXPath()
         }
      }
      catch {
          case e :Exception => println(e)
      }
     }
    }

VTD-XML ライブラリをインポートしました。コンパイルは良好ですが、実行時に例外が出力されます。

:java.lang.ArrayIndexOutOfBoundsException: -1

コードのwhileの問題を解決しました。しかし問題は、私が常に-1を取得することですap.evalXPAth

4

2 に答える 2

4

答えはラインにあると信じています

while((i=ap.evalXPath)!= -1) {

Scala では代入は Unit (Java では void に相当) を返すため、このループは終了できません。たとえば、次のようなプログラムは無限ループします

scala> var i = 0
i: Int = 0

scala> while((i = i + 1) != 10) { println(i) }
<console>:7: warning: comparing values of types Unit and Int using `!=' will always yield true
       while((i = i + 1) != 10) { println(i) }
于 2011-02-26T13:16:43.007 に答える
1

ジョン・マクレーが言ったように。while チェックは scala では飛びません。代わりに、-1 で終了する呼び出しに対して、次のような新しい while 構造を定義できます。

def whileNotEmpty(whileF: () => Int)(doF: (Int) => Unit): Unit = { 
  val n = whileF()
  if (n != -1) { 
    doF(n)
    whileNotEmpty(whileF)(doF) 
  } 
}

これは、-1 を指定するまでキーボードから読み取る呼び出しの簡単な例です。

whileNotEmpty(() => Console.readLine.toInt) { 
  n => println(n) 
}
于 2011-02-26T20:48:02.387 に答える