使用 VTD-XML 的 Scala 程序中的 ArrayIndexOutofBoundException

发布于 2024-10-19 11:33:26 字数 1000 浏览 2 评论 0原文

    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 问题。但问题是我总是为 ap.evalXPAth 得到 -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)
      }
     }
    }

I have imported VTD-XML Library
It compiles Well but On Execution prints an Exception

:java.lang.ArrayIndexOutOfBoundsException: -1

I have solved the while issue in the code. But the problem is I always get -1 for ap.evalXPAth

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

耳根太软 2024-10-26 11:33:26

我相信答案就

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

在 In Scala assignment returns Unit (equivalent to void in 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) }

I believe the answer lies in the line

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

In Scala assignment returns Unit (equivalent to void in Java) and hence this loop cannot terminate. For example the program as follows loops infinitely

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) }
極樂鬼 2024-10-26 11:33:26

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

As John McCrae said; the while check will not fly in scala. Instead you can define a new while construction like this for -1-ending calls:

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

This is a simplified example of an invocation that read from the keyboard until you give -1:

whileNotEmpty(() => Console.readLine.toInt) { 
  n => println(n) 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文