如何解决scala中的java.lang.NullPointerException?

时间:2016-01-14 17:14:31

标签: java scala

假设我的部分代码如下: - doc是包含stu_name和roll_number的List [Document] 有时stu_name和roll_name可能为null。

我使用Try来避免前两行中出现空指针异常。 但是为什么我会在" val myRow"。

中再次获得Null Pointer异常
    val name= Try {Option.apply(doc.getFieldValue("stu_name"))}.getOrElse(null)
    val rollNumber ={Option.apply(doc.getFieldValue("roll_number"))}.getOrElse(null)

    val myRow = (
     doc.getFieldValue("ID").asInstanceOf[Int]   //can't be null
     name.getOrElse(null).toString,   //NullPointerException
     rollNumber.getOrElse(null).asInstanceOf[Int] //NullPointerException
    )

    .....
    .....

我收到以下错误:

 [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

1 个答案:

答案 0 :(得分:1)

这都错了。通过使用getOrElse(null),您基本上消除了使用Option开头的所有优势。另外,产生的复杂性远远超过需要。

如果值为null,您需要定义要执行的操作。这只是将它们保持为Options(空输入时为None):

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)  
)