我在运行Spark应用程序时遇到了Exception in thread "Driver" java.lang.NullPointerException
,这是因为我的代码位于class
而不是object
内,如建议的here。但是,只是想知道为什么主类必须是object
。是否可以使用类?
答案 0 :(得分:3)
这是Scala本身的一个问题,而不是Spark。编译Scala <root>
<channel id="Digi.TR">
<display-name lang="tr">Digi</display-name>
<url>http://www.digiturk.com.tr</url>
</channel>
<channel id="Star.tr">
<display-name lang="tr">Star</display-name>
<url>http://www.digiturk.com.tr</url>
</channel>
<channel id="ATV.tr">
<display-name lang="tr">ATV</display-name>
<url>http://www.digiturk.com.tr</url>
</channel>
</root>
时,内部方法不会转换为Java静态方法的等效方法。这意味着main方法不会是 static ,因此JVM在执行程序时将无法找到它。相比之下,Scala class
中的所有方法都将是 static 。可以找到差异的良好解释here。
由于主要方法需要位于object
,因此无法仅使用单个class
。但是,有object
可以只创建object
的实例以及class
中的所有其他代码 - 但是当您可以简单地创建{{}时,似乎没有必要1}}改为class
。
答案 1 :(得分:2)
我会按顺序回答你的问题:
这是因为Scala中不存在静态成员(方法或字段)。 Scala不是定义静态成员,而是在单例对象中声明这些成员。
一个对象是一个只有一个实例的类,它在引用时会被懒惰地创建。因此,当我们声明Object
时,我们声明一个单例对象。
没有的的
除了帮助理解这个概念之外,你还必须理解伴侣对象的概念,它是一个与类同名的对象。
使用这个我们可以声明与class同名的对象,然后在那里声明静态成员。
例如在下面的代码我保持标题静态。
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!