Что вызывает это ArrayIndexOutOfBoundsException? - PullRequest
0 голосов
/ 29 сентября 2011

Я новичок в 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) в Main.main (SimpleIfSatementDemo.scala) в sun.reflect.NativeMethodAccessorImpl.invoke0 (Собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.vo.eg.regв 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.utilLoader UCRA.run (ScalaClassLoader.scala: 101) в scala.tools.nsc.ObjectRunner $ .run (ObjectRunner.scala: 33) в scala.tools.nsc.ObjectRunner $ .runAndCatch (ObjectRunner.scala: 40) в scala.tools.нсc.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 $ сCompiledScript $ 1.apply $ mcZ $ sp (ScriptRunner.scala: 157) в scala.tools.nsc.ScriptRunner $$ anonfun $ withCompiledScript $ 1.apply (ScriptRunner.scala: 131) в scala.tools.nsc.ScriptRunner $$ anonfun $ сCompiledScript $ 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 (MainGenalaun.un: 80).nsc.MainGenericRunner$ .main (MainGenericRunner.scala: 89) по адресу scala.tools.nsc.MainGenericRunner.main (MainGenericRunner.scala)


Спасибо

Ответы [ 2 ]

7 голосов
/ 29 сентября 2011

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

5 голосов
/ 29 сентября 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 , чтобы добавить аргументы в команду run.

...