假设我有一个模型类,如下所示:
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.date
是null
,此时我不断获得java.lang.NullPointerException
。我该如何处理这个例外?
答案 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)
在这种情况下,如果你给出一个值,它取值,否则它将取无作为默认值。