是什么导致这个ArrayIndexOutOfBoundsException?

Ben*_*Ben 0 scala runtime-error

我是斯卡拉的新手.

这是简单的代码


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)               
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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


java.lang.ArrayIndexOutOfBoundsException: 0   at
Run Code Online (Sandbox Code Playgroud)

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


谢谢

小智 7

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

println("I have " + args.length + " argument(s)")
Run Code Online (Sandbox Code Playgroud)

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

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

如何使用这些新知识使程序更健壮(而不是抛出异常)?

快乐的编码.


Scala的First Steps文章提供了传递和使用参数的示例.


huy*_*hjl 5

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

$ scala SimpleIfStatementDemo.scala 1 2
Run Code Online (Sandbox Code Playgroud)

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

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

$ scalac -d classes SimpleIfStatementDemo.scala
$ scala -cp classes SimpleIfStatementDemo 1 2
Run Code Online (Sandbox Code Playgroud)

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