【问题标题】:ArrayIndexOutofBoundException In Scala Program Usind VTD-XMLScala程序中的ArrayIndexOutofBoundException使用VTD-XML
【发布时间】:2011-02-26 11:48:18
【问题描述】:
    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

【问题讨论】:

  • 运行时异常通常使用堆栈跟踪来调试...您能否更具体地了解您的问题?
  • 你在这里使用 try/catch 的方式很糟糕:你捕捉到所有的问题并脱离上下文打印单个消息。顺便说一句,您的问题很可能与 scala 无关。

标签: scala vtd-xml scala-xml


【解决方案1】:

我相信答案就在这条线上

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

【讨论】:

  • @vtd-xml-author 不这样做将是一种解决方法。确实没有必要同时分配和测试,并且有很多方法可以避免它。但如果有人坚持,总是可以写while({i = ap.evalXPath; i != -1}) {
【解决方案2】:

正如约翰麦克雷所说; 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) 
}

【讨论】:

  • 我已经解决了代码中的 While 问题。但我总是发现 ap.evalXPath 返回 -1。 XPath 设置正确。
  • 你的 xml 是什么样的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多