2011-02-26 32 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