如何解决scala中的java.lang.NullPointerException?
假设我的部分代码如下:- 其中doc是包含stu_名称和roll_编号的列表[文档] 有时stu_name和roll_name可能为空 我曾经尝试在前两行中避免空指针异常。 但为什么我在“val myRow”中再次出现空指针异常 我发现以下错误:如何解决scala中的java.lang.NullPointerException?,java,scala,Java,Scala,假设我的部分代码如下:- 其中doc是包含stu_名称和roll_编号的列表[文档] 有时stu_name和roll_name可能为空 我曾经尝试在前两行中避免空指针异常。 但为什么我在“val myRow”中再次出现空指针异常 我发现以下错误: [2016-01-14 22:40:16,896] WARN o.a.s.s.TaskSetManager [] [akka://JobServer/user/context-supervisor/demeter] - Lost task 0.0
[2016-01-14 22:40:16,896] WARN o.a.s.s.TaskSetManager [] [akka://JobServer/user/context-supervisor/demeter] - Lost task 0.0 in stage 0.0 (TID 0, 10.29.23.136): java.lang.NullPointerException
at com.test.events.Monitoring$$anonfun$geteventTableReplicateDayFunc$1.apply(Monitoring.scala:75)
at com.test.events.Monitoring$$anonfun$geteventTableReplicateDayFunc$1.apply(Monitoring.scala:57)
at com.test.events.Monitoring$$anonfun$27.apply(Monitoring.scala:104)
at com.test.events.Monitoring$$anonfun$27.apply(Monitoring.scala:104)
我在控制台中尝试了以下操作,但没有看到任何错误:
scala> val a = Try (Option.apply("atar")).getOrElse(null)
a: Option[String] = Some(atar)
scala> a.getOrElse(null)
res16: String = atar
scala> val a = Try (Option.apply(null)).getOrElse(null)
a: Option[Null] = None
scala> a.getOrElse(null)
res17: Null = null
这是完全错误的。通过使用
getOrElse(null)
基本上消除了使用选项的所有优势。此外,产生的复杂性远远超过需要
您需要定义如果值为空,您将执行什么操作。这只是将它们保留为选项
(无
空输入):
或使用默认值:
val myRow = (
doc.getFieldValue("ID").toInt,
Option(doc.getFieldValue("stu_name")).getOrElse("default"),
Option(doc.getFieldValue("roll_number")).map(_.toInt).getOrElse(0)
)
如果doc
null,那么?doc不能为null。有些字段是必须存在的。但是你确定吗?您的堆栈跟踪没有填写此处的所有详细信息。是的。当然..不能为空。我又添加了一个必填字段。name.getOrElse(null)。toString
这完全不好<null
上的code>toString
不存在。
val myRow = (
doc.getFieldValue("ID").toInt, // Fails if null
Option(doc.getFieldValue("stu_name")), // `None` if null
Option(doc.getFieldValue("roll_number")).map(_.toInt) // `None` if null
)
val myRow = (
doc.getFieldValue("ID").toInt,
Option(doc.getFieldValue("stu_name")).getOrElse("default"),
Option(doc.getFieldValue("roll_number")).map(_.toInt).getOrElse(0)
)