1

私は Scala Liftweb を使用しており、このモデル オブジェクトがあります。

object Product extends Product with LongKeyedMetaMapper[Product] {
  override def dbTableName = "products"

  override def dbIndexes = UniqueIndex(slug) :: super.dbIndexes

  def menus = sitemap

  lazy val sitemap: List[Menu] = List(editProductMenuLoc, listProductsMenuLoc, createProductMenuLoc, indexProductsMenuLoc).flatten(a => a)

  protected def editProductMenuLoc =
    Full(Menu(Loc("EditProduct" + menuNameSuffix, editPath, S.?("edit.product"))))

  protected def listProductsMenuLoc = Full(Menu(Loc("ListProduct" + menuNameSuffix, listPath, S.?("list.products"))))

  protected def indexProductsMenuLoc = Full(Menu(Loc("ListProduct" + menuNameSuffix, indexPath, S.?("index.products"))))

  protected def createProductMenuLoc =
    Full(Menu(Loc("CreateProduct" + menuNameSuffix, createPath, S.?("create.product"))))

  protected val menuNameSuffix = ""

  protected val editSuffix = "edit"

  protected val createSuffix = "create"

  protected val viewSuffix = "view"

  protected val editPath = theAdminPath(editSuffix)

  protected val createPath = theAdminPath(createSuffix)

  protected val viewPath = thePath(viewSuffix)

  protected val listPath = basePath

  protected val indexPath = adminPath

  protected def thePath(end: String): List[String] = basePath ::: List(end)

  protected def theAdminPath(end: String): List[String] = adminPath ::: List(end)

  protected val basePath: List[String] = "products" :: Nil

  protected val adminPath: List[String] = "admin" :: "products" :: Nil
}

コンパイルすると問題なく動作しますが、実行しようとすると次のエラーが発生します。

Caused by: java.lang.NullPointerException: null
    at scala.collection.immutable.List.$colon$colon$colon(List.scala:120) ~[scala-library.jar:0.12.2]
    at code.model.Product$.theAdminPath(Product.scala:65) ~[classes/:na]
    at code.Product$.<init>(Product.scala:53) ~[classes/:na]
    at code.Product$.<clinit>(Product.scala) ~[classes/:na]
    ... 49 common frames omitted

ソースで見つけたコードに基づいてこれらのパスをモデル化しましたが、MegaProtoMetaUserここで null ポインター例外が発生する理由がわかりません。すべての値が適切に入力されていますよね?

4

1 に答える 1

5

問題は、フィールドが初期化される順序です。これは上から下です。これは、basePath と adminPath の前に、editPath、createPath、および viewPath が初期化されることを意味します。これらの以前のフィールドは、ベース パスが初期化される前にメソッド thePath および theAdminPath を呼び出すため、これらのメソッドへの呼び出しは、basePath および adminPath の事前に初期化された値 - null を使用します。これら 2 つのフィールドの定義を、それらを含むメソッドを呼び出すフィールドの定義の上に移動してみてください。

于 2013-08-29T22:28:20.510 に答える