2011-02-26 71 views
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庫 它編譯良好,但在執行打印的異常ArrayIndexOutofBoundException在斯卡拉計劃Usind VTD-XML

:java.lang.ArrayIndexOutOfBoundsException: -1 

我已經解決了,而問題的代碼。但問題是,我總是得到-1 ap.evalXPAth

+0

運行通常使用堆棧跟蹤來調試異常......您能更具體地瞭解您的問題嗎? – Palimondo 2011-02-26 12:24:58

+0

您在這裏使用try/catch的方式很糟糕:您可以捕捉所有問題並從上下文中打印單個消息。順便說一句,你的問題很可能與scala無關。 – Palimondo 2011-02-26 12:34:35

回答

4

我相信答案就在於行

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

在斯卡拉分配收益股(相當於在Java中無效),因此這個循環不能終止。例如程序如下無限循環

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

這個問題的解決方法是什麼? – 2011-02-26 18:53:18

+1

@ vtd-xml-author不這樣做將是一個解決方法。真的不需要同時分配和測試,還有很多避免的方法。但是如果堅持,可以總是寫'while({i = ap.evalXPath; i!= -1}){'。 – 2011-02-27 02:04:18

1

正如約翰麥克雷所說的; while檢查不會在scala中飛行。相反,你可以定義一個新的建築時像這樣-1-結束通話:

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

我已經解決了代碼中的While問題。但我總是發現ap.evalXPath返回-1。 XPath設置正確。 – AnsigT 2011-02-28 09:08:20

+0

你的xml是什麼樣的? – thoredge 2011-02-28 09:19:25