![](/img/trans.png)
[英]Handle java.lang.NullPointerException in scala when accessing nested fields
[英]Handle java.lang.NullPointerException in 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.date
為null
,此時我一直收到java.lang.NullPointerException
。 我該如何處理這個例外?
我建議你直接通過構造函數初始化值。 這看起來像一個POSO(普通的舊Scala對象),所以也許你會更好用一個不可變的case類:
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)
}
}
Option[T]
一個好處是它有一個安全的默認值None
。 因此,將您的變量初始化為None
而不是null
。
您還應該考慮使您的模型類不可變。
更簡單的方法是這樣做
case class User(id: Option[Long]=None, name: Option[String]=None, date: Option[Date]=None)
在這種情況下,如果您給出一個值,它取值,否則它將取無值作為默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.