是什么导致这个ArrayIndexOutOfBoundsException?

时间:2011-09-29 01:07:04

标签: scala runtime-error

我是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(SimpleIfSatementDemo.scala:5)at   Main.main(SimpleIfSatementDemo.scala)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     在java.lang.reflect.Method.invoke(Method.java:597)at   scala.tools.nsc.util.ScalaClassLoader $$ anonfun $运行$ 1.适用(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)at at   scala.tools.nsc.ObjectRunner $ .runAndCatch(ObjectRunner.scala:40)at at   scala.tools.nsc.ScriptRunner.scala $工具$ NSC $ ScriptRunner $$ runCompiled(ScriptRunner.scala:171)     在   scala.tools.nsc.ScriptRunner $$ anonfun $ $的runScript 1.适用(ScriptRunner.scala:188)     在   scala.tools.nsc.ScriptRunner $$ anonfun $ $的runScript 1.适用(ScriptRunner.scala:188)     在   scala.tools.nsc.ScriptRunner $$ anonfun $ withCompiledScript $ 1.适用$ MCZ $ SP(ScriptRunner.scala:157)     在   scala.tools.nsc.ScriptRunner $$ anonfun $ withCompiledScript $ 1.适用(ScriptRunner.scala:131)     在   scala.tools.nsc.ScriptRunner $$ anonfun $ withCompiledScript $ 1.适用(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)at at   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 $。主要(MainGenericRunner.scala:89)     在scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)


感谢

2 个答案:

答案 0 :(得分:7)

程序没有传递足够的参数(它至少需要两个;请参阅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包含传递和使用参数的示例。

答案 1 :(得分:5)

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

$ scala SimpleIfStatementDemo.scala 1 2

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

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

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

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