Что вызывает это исключение ArrayIndexOutOfBoundsException?

Я новичок в скале.

вот простой код


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) в Main.main(SimpleIfSatementDemo.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) в масштабе a.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.pr ocess(MainGenericRunner.scala:80) в scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89) в scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)


Спасибо


person Ben    schedule 29.09.2011    source источник


Ответы (2)


Программе передается недостаточное количество аргументов (необходимо как минимум два; см. руководство по командам Java, чтобы узнать, как их можно указать). Рассмотрите возможность размещения этого кода в качестве первой строки основного метода:

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!

Как можно использовать это новое знание, чтобы сделать программу более надежной (и не вызывать исключения)?

Удачного кодирования.


В статье Первые шаги к Scala приведены примеры передачи и использования аргументов.

person Community    schedule 29.09.2011
comment
спасибо, приятель, но я пробую свой код в Windows, и он отлично работает, я не знаю, почему он не работает в Mac OS X. Благодарность - person Ben; 30.09.2011

Предполагая, что вы запускаете из командной строки версию 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, чтобы добавить аргументы в команду запуска.

person huynhjl    schedule 29.09.2011