【问题标题】:What causes this ArrayIndexOutOfBoundsException?是什么导致了这个 ArrayIndexOutOfBoundsException?
【发布时间】:2011-11-27 07:53:25
【问题描述】:

我是 scala 的新手。

这里是简单的代码


object SimpleIfStatementDemo {
  def main(args: Array[String]) {   
    var numA: Int = args(0).toInt
    var numB: Int = args(1).toInt
    if(numA>numB) {
      print(numA)
    } else {
      print(numB)               
    }
  }
}

它可以编译,但不能运行。这是我得到的错误


java.lang.ArrayIndexOutOfBoundsException: 0   at

Main$.main(SimpleIfSamentDemo.scala:5) 在 Main.main(SimpleIfSamentDemo.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78) 在 scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24) 在 scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88) 在 scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78) 在 scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101) 在 scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33) 在 scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40) 在 scala.tools.nsc.ScriptRunner.scala$tools$nsc$ScriptRunner$$runCompiled(ScriptRunner.scala:171) 在 scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188) 在 scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188) 在 scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply$mcZ$sp(ScriptRunner.scala:157) 在 scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131) 在 scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131) 在 scala.tools.nsc.util.package$.waitingForThreads(package.scala:26) 在 scala.tools.nsc.ScriptRunner.withCompiledScript(ScriptRunner.scala:130) 在 scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:188) 在 scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:201) 在 scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:58) 在 scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80) 在 scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89) 在 scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)


谢谢

【问题讨论】:

    标签: scala runtime-error


    【解决方案1】:

    程序没有传递足够的参数(它至少需要两个;请参阅the java command manual 了解如何指定这些参数)。考虑将此代码作为 main 方法的第一行:

    println("I have " + args.length + " argument(s)")
    

    然后在 Scala REPL 上试试这个,看看类似的爆炸:

    val a = Array("Hello world!") // array of one element
    a(0)      // access first element, okay
    a(1)      // access second element -- KABOOM!
    

    如何利用这些新知识使程序更加健壮(并且不抛出异常)?

    编码愉快。


    文章First Steps to Scala有传递和使用参数的例子。

    【讨论】:

    • 感谢队友,但我在 Windows 上尝试了我的代码并且工作正常,我不知道为什么在 mac os x 中无法工作。谢谢
    【解决方案2】:

    假设您使用 2.9.0 或更高版本在命令行运行,并且您的源代码包含在名为 SimpleIfStatementDemo.scala 的文件中:

    $ scala SimpleIfStatementDemo.scala 1 2
    

    将为您的程序提供参数 1 和 2。

    在 2.9.x 和 2.8.x 上,您还可以将源代码编译成 class 文件,编译成 JVM 的中间字节码。一个好的做法是将它们放在子目录下(本例中为classes):

    $ scalac -d classes SimpleIfStatementDemo.scala
    $ scala -cp classes SimpleIfStatementDemo 1 2
    

    如果您在 IDE 中运行,则必须弄清楚如何编辑 run 配置以向运行命令添加参数。

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 2019-07-01
      • 2011-02-12
      • 2015-09-08
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多