MeWrite Docs

Scala: NullPointerException

Scalaでnull参照にアクセスした場合のエラー

概要

Scalaでnullオブジェクトのメソッドやフィールドにアクセスしようとした場合に発生するエラーです。Javaとの相互運用時に特に発生しやすいです。

エラーメッセージ

java.lang.NullPointerException
    at com.example.MyClass.method(MyClass.scala:10)

原因

  1. Javaライブラリからのnull: JavaメソッドがnullをJを返す
  2. 初期化前のアクセス: 遅延初期化されていない変数へのアクセス
  3. varの未初期化: varをnullで初期化
  4. nullを許容する設計: Option を使用していない

解決策

1. Option を使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 悪い例
def findUser(id: Int): User = {
  if (userExists(id)) getUser(id)
  else null  // nullを返す
}
val user = findUser(1)
user.name  // NullPointerException

// 良い例
def findUser(id: Int): Option[User] = {
  if (userExists(id)) Some(getUser(id))
  else None
}
findUser(1).map(_.name).getOrElse("不明")

2. Javaとの相互運用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import scala.jdk.CollectionConverters._

// 悪い例
val map = javaMap.get("key")  // nullの可能性
map.toString  // NullPointerException

// 良い例
Option(javaMap.get("key")).map(_.toString).getOrElse("デフォルト")

// または ScalaのMapに変換
val scalaMap = javaMap.asScala
scalaMap.get("key")  // Option[Value]

3. null チェック

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 悪い例
val result = externalApi.getData()
result.process()  // nullかもしれない

// 良い例
Option(externalApi.getData()).foreach(_.process())

// または require
require(result != null, "データがnullです")
result.process()

4. lazy val の適切な使用

1
2
3
4
5
6
7
8
9
// 悪い例:循環依存でnull
class A(b: B) {
  val value = b.value + 1  // bがまだ初期化されていない可能性
}

// 良い例:lazy valで遅延評価
class A(b: B) {
  lazy val value = b.value + 1
}

5. 初期化順序に注意

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 悪い例
trait Base {
  val name: String
  val greeting = s"Hello, $name"  // nameがまだnull
}
class Derived extends Base {
  val name = "World"
}
// greeting = "Hello, null"

// 良い例:lazy valを使用
trait Base {
  val name: String
  lazy val greeting = s"Hello, $name"
}

6. case class のコピー

1
2
3
4
5
6
// case classでnullを避ける
case class User(name: String, email: Option[String] = None)

// 安全なコピー
val user = User("John", Some("john@example.com"))
val updated = user.copy(email = None)  // nullではなくNone

7. コンパイラオプション

1
2
// build.sbt
scalacOptions += "-Yexplicit-nulls"  // Scala 3

よくある間違い

  • JSONパーサーからのnullフィールドを考慮していない
  • データベースのNULL値の処理
  • Javaコレクションのnull要素
  • リフレクションで取得した値

Scala の他のエラー

最終更新: 2025-12-09