NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
bro
в двух случаях совершенно иная. В первом случае это поле для экземпляра одноэлементного класса (TryBroadcast
). Во втором он является локальной переменной.
I локальная переменная захватывается, сериализуется и отправляется исполнителям. В первом случае ссылка на поле, поэтому синглтон будет захвачен и отправлен. Я не знаю, как построен синглтон Scala и как он захватывается. По-видимому, в этом случае он заканчивается неинициализированным при доступе к исполнителю.
Вы можете сделать bro
локальную переменную следующим образом:
object TryBroadcast extends App {
val conf = new SparkConf().setAppName("o_o")
val sc = new SparkContext(conf)
val sample = sc.parallelize(1 to 1024)
val broSample = {
val bro = sc.broadcast(6666)
sample.map(x => x.toString + bro.value)
}
broSample.collect().foreach(println)
}
Это не очень хорошо документировано, но рекомендуется использовать def main(args: Array[String]): Unit = ???
вместо extends App
.
См. https://issues.apache.org/jira/browse/SPARK -4170 и https://github.com/apache/spark/pull/3497