在Scala中处理java.lang.NullPointerException

时间:2016-05-26 07:51:56

标签: java scala

假设我有一个模型类,如下所示:

class User () {
  var id: Option[java.lang.Long] = _
  var name: Option[String] = _
  var date: Option[java.util.Date] = _

  def this(id: java.lang.Long,name: String, date: java.util.Date){
    this()
    this.id=Option(id)
    this.name=Option(name)
    this.date=Option(date)
  }
}

我尝试通过

创建一个对象
var obj = new User
obj.id=12345
obj.name=user

显然obj.datenull,此时我不断获得java.lang.NullPointerException。我该如何处理这个例外?

3 个答案:

答案 0 :(得分:3)

我建议你直接通过构造函数初始化值。这看起来像一个POSO(普通的旧Scala对象),所以也许你会更好地使用一个不可变的案例类:

case class User(id: Option[Long], name: Option[String], date: Option[Date])

现在,如果您只想初始化一些属性,可以通过None传递或通过随播对象创建辅助构造函数:

case class User(id: Option[Long], name: Option[String], date: Option[Date])
object User {
  def apply(id: Option[Long], name: Option[String]) = {
    User(id, name, None)
  }
}

编辑:

如果Java互操作很重要,您可以在case类中定义多个构造函数,这些构造函数将在Java中可见:

case class User(id: Option[Long], name: Option[String], date: Option[Date]) {
  def this(id: Long, name: String) = {
    this(Some(id), Some(name), None)
  }
}

答案 1 :(得分:0)

Option[T]的一个好处是它有一个安全的默认值None。因此,请将您的变量初始化为None而不是null

您还应该考虑让您的模型类不可变。

答案 2 :(得分:0)

更简单的方法是

case class User(id: Option[Long]=None, name: Option[String]=None, date: Option[Date]=None)

在这种情况下,如果你给出一个值,它取值,否则它将取无作为默认值。