【发布时间】:2016-11-28 07:47:30
【问题描述】:
我正在学习 Scala 并尝试编写一些命令行可执行文件。
我有两个版本的 HelloWorld,我认为它们在语义上是相同的。 HelloWorld.scala 从命令行编译并运行成功。 HelloWorld2.scala 编译但产生运行时错误。
我的问题:我认为两者在语义上是相同的,那么为什么第二个会产生运行时错误?
下面是工作示例:
// HelloWorld.scala
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, World!")
}
}
以下是损坏的示例:
// HelloWorld2.scala
object HelloWorld2 {
def main
: Array[String] => Unit
= args => {
println("Hello, World!")
}
}
这是控制台输出:
java.lang.NoSuchMethodException: HelloWorld2.main([Ljava.lang.String;)
at java.lang.Class.getMethod(Class.java:1778)
at scala.reflect.internal.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:66)
at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:22)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:29)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:65)
at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
【问题讨论】:
-
它正在寻找
HelloWorld2.main,但您只有HelloWorld.main。尝试更改类名以匹配文件,或更改文件名以匹配类(即将损坏的示例中的代码复制到 HelloWord.scala 中) -
这里有两个不同的东西:
main方法采用Array[String]并具有返回类型Unit,与main方法不采用参数并返回一个函数一个Array[String],返回类型为Unit。 -
@TheDark,感谢您指出对象名称。 TBH,这只是我的问题中的一个错字:我正在使用的实际文件正确地命名了该对象。
-
@Jesper,在我最疯狂的想象中,我从未想过一个方法和一个函数不是一回事^_^;