【发布时间】:2018-08-14 23:25:59
【问题描述】:
我在运行我的 Spark 应用程序时遇到了Exception in thread "Driver" java.lang.NullPointerException,这是因为我的代码在class 中,而不是object 中,正如here 所建议的那样。但是,只是想知道为什么主类必须是object。可以改用类吗?
【问题讨论】:
标签: scala apache-spark
我在运行我的 Spark 应用程序时遇到了Exception in thread "Driver" java.lang.NullPointerException,这是因为我的代码在class 中,而不是object 中,正如here 所建议的那样。但是,只是想知道为什么主类必须是object。可以改用类吗?
【问题讨论】:
标签: scala apache-spark
我会按顺序回答你的问题:
这是因为 Scala 中不存在静态成员(方法或字段)。 Scala 不是定义静态成员,而是在单例对象中声明这些成员。
一个对象是一个只有一个实例的类,它在被引用时被延迟创建。因此,当我们声明 Object 时,我们声明了一个单例对象。
没有。
除了帮助理解概念外,还要理解伴生对象的概念,它是一个与类同名的对象。
使用这个我们可以声明与类同名的对象,然后在那里声明静态成员。
例如在下面的代码中,我保持标题不变。
class HelloWorld(msg:String) {
import HelloWorld._ //import static members
def msg():String = {
getHeader + msg //append static header
}
}
object HelloWorld { //companion object
private def getHeader:String = "Hello, " //static method
def main(args: Array[String]) {
val scalaObj = new HelloWorld("scala!")
val pyObj = new HelloWorld("Python!")
println(scalaObj.msg)
println(pyObj.msg)
}
}
输出:
Hello, scala!
Hello, python!
【讨论】:
这是 Scala 本身的问题,而不是 Spark。编译 Scala class 时,内部的方法不会转换为等效的 Java 静态方法。这意味着 main 方法将不是 static,因此 JVM 在执行程序时将无法找到它。相反,Scala object 中的所有方法都将是静态。可以在 here 找到对差异的很好解释。
不可能只使用一个class,因为main 方法需要在object 中。但是,可以有一个 object 来简单地创建 class 的一个实例以及 class 中的所有其他代码 - 但是当您可以简单地将 class 变成 object 时,这似乎是不必要的而是。
【讨论】: