PC パソコン

Kotlin「Expecting ‘}’」の原因と解決方法

Kotlinでコードを記述していると、「Expecting ‘}’」というエラーが表示されることがあります。

このエラーは、Kotlinのコンパイラがコードを解析している途中で、閉じ波括弧}が必要であるにもかかわらず見つからない場合などに発生します。

原因としては、関数やクラス、ifwhen、ループ、ラムダ式などで使用する波括弧{}の閉じ忘れや、直前の構文エラーによって括弧の対応関係が崩れていることなどが考えられます。

この記事では、Kotlinで「Expecting ‘}’」が表示される主な原因と、基本的な解決方法を紹介します。

「Expecting ‘}’」とは

「Expecting ‘}’」は、コンパイラがコードを解析した際に、その位置までに閉じ波括弧}が必要であると判断したことを示す構文エラーです。

例えば、関数のブロックを閉じる波括弧を書き忘れると発生することがあります。

fun main() {
    println("Hello")

このコードでは、main()のブロックを閉じる}がありません。

閉じ波括弧を追加します。

fun main() {
    println("Hello")
}

原因1:関数の閉じ波括弧を忘れている

もっとも基本的な原因の一つは、関数の処理ブロックを閉じる}を書き忘れていることです。

fun showMessage() {
    println("Hello")

この場合、関数の開始を表す{に対応する}がありません。

関数の最後に閉じ波括弧を追加します。

fun showMessage() {
    println("Hello")
}

原因2:if文の波括弧を閉じ忘れている

if文のブロックを閉じる波括弧が不足している場合も、「Expecting ‘}’」が表示されることがあります。

fun main() {
    val age = 20

    if (age >= 18) {
        println("Adult")
}

この例では、ifブロックとmain()ブロックに必要な波括弧の対応が不足しています。

それぞれのブロックを正しく閉じます。

fun main() {
    val age = 20

    if (age >= 18) {
        println("Adult")
    }
}

原因3:when式の閉じ波括弧を忘れている

when式でも、ブロックを閉じる}が不足すると構文エラーになります。

when (value) {
    1 -> println("One")
    2 -> println("Two")

このコードでは、when式を閉じる波括弧がありません。

最後に}を追加します。

when (value) {
    1 -> println("One")
    2 -> println("Two")
}

原因4:forやwhileなどのループの波括弧を閉じ忘れている

forwhileなどのループ処理でも、開始したブロックを閉じる必要があります。

for (i in 1..5) {
    println(i)

この場合、forブロックを閉じる}が不足しています。

for (i in 1..5) {
    println(i)
}

特に、ループの中にさらにifや別のループがある場合は、どの波括弧がどのブロックに対応しているのか分かりにくくなることがあります。

原因5:クラスの閉じ波括弧を忘れている

クラスの定義でも、クラス本体を閉じる波括弧が必要です。

class User {

    fun showName() {
        println("Taro")
    }

このコードでは、showName()のブロックは閉じられていますが、Userクラス自体を閉じる}がありません。

クラスの最後に閉じ波括弧を追加します。

class User {

    fun showName() {
        println("Taro")
    }
}

原因6:ラムダ式の波括弧を閉じ忘れている

ラムダ式でも{}を使用するため、閉じ波括弧を忘れると「Expecting ‘}’」が表示されることがあります。

val action = { value: Int ->
    println(value)

この場合、ラムダ式の処理ブロックを閉じる}がありません。

val action = { value: Int ->
    println(value)
}

原因7:ネストしたブロックの波括弧が不足している

関数の中にif、さらにその中にループなど、複数のブロックが入れ子になっている場合は、閉じ波括弧の不足が起こりやすくなります。

fun main() {
    if (true) {
        for (i in 1..3) {
            println(i)
    }
}

このようなコードでは、波括弧の数や位置が分かりにくくなり、どこかのブロックを閉じ忘れることがあります。

インデントを整え、それぞれの{に対応する}が存在するか確認します。

fun main() {
    if (true) {
        for (i in 1..3) {
            println(i)
        }
    }
}

原因8:コメントアウトによって閉じ波括弧が消えている

コードを一時的にコメントアウトした際に、必要な閉じ波括弧までコメントに含めてしまうことがあります。

fun main() {
    println("Hello")

    /*
    println("Test")
}

このようにコメントの範囲を間違えると、コンパイラから見て必要なコードや波括弧が存在しない状態になる場合があります。

ブロックコメント/* */の開始位置と終了位置を確認し、必要な波括弧がコメントアウトされていないか確認します。

原因9:文字列やコメントの閉じ忘れが影響している

実際には波括弧が存在していても、その前に文字列やコメントの閉じ忘れがあると、コンパイラが後続のコードを正しく解析できず、「Expecting ‘}’」が表示されることがあります。

fun main() {
    val message = "Hello
    println(message)
}

この例では}自体は存在していますが、文字列の閉じる引用符がありません。

引用符を正しく閉じます。

fun main() {
    val message = "Hello"
    println(message)
}

「Expecting ‘}’」が表示されても、必ずしも閉じ波括弧そのものが不足しているとは限りません。引用符やコメントなど、それ以前の構文エラーによって波括弧を正しく認識できなくなっている場合もあります。

原因10:エラーが表示された場所より前に問題がある

「Expecting ‘}’」は、実際に波括弧を書き忘れた位置ではなく、ファイルの最後や別の行に表示されることがあります。

コンパイラはコードを上から順番に解析するため、開いたブロックが最後まで閉じられなかった場合、ファイル末尾付近で閉じ波括弧を期待してエラーを表示することがあります。

そのため、エラーが表示された行だけではなく、それより前にある関数、クラス、条件分岐、ループなども確認する必要があります。

波括弧の数と対応を確認する

「Expecting ‘}’」が表示された場合は、まずコード内の{}が正しく対応しているか確認します。

単純に開き波括弧の数に対して閉じ波括弧が不足している場合は、不足している位置を特定して追加します。

ただし、波括弧の数が同じでも、閉じる位置が間違っているとコードの構造が崩れることがあります。

波括弧は数だけではなく、「どのブロックを閉じているか」を確認することが重要です。

インデントを整えて確認する

波括弧の対応が分からなくなった場合は、コードのインデントを整えると原因を見つけやすくなります。

fun main() {
    if (true) {
        println("Hello")
    }
}

インデントを揃えることで、それぞれの開始波括弧と閉じ波括弧の関係を視覚的に確認しやすくなります。

Android StudioなどのIDEではコードの自動整形を利用できるため、構造が崩れている場所を確認する際にも役立ちます。

対応する波括弧をIDEで確認する

Android StudioなどのIDEでは、{}にカーソルを合わせると、対応する波括弧が強調表示されることがあります。

長い関数や複雑にネストしたコードでは、この機能を利用してどの波括弧が対応しているのか確認すると、閉じ忘れを見つけやすくなります。

コードを一時的に小さくして原因を確認する

長い関数や複雑なクラスで原因が分からない場合は、問題がありそうな部分を一時的に削除したり、コメントアウトしたりしてコードを小さくすると確認しやすくなります。

ただし、コメントアウトするときに必要な波括弧まで含めてしまわないよう注意します。

ブロックごとに確認することで、どの部分を追加したときに波括弧の対応が崩れるのか特定しやすくなります。

Expecting ‘}’が表示されたときの確認ポイント

「Expecting ‘}’」が表示された場合は、開いたブロックが正しく閉じられているかを中心に確認します。

  • 関数の{}が正しく閉じられているか
  • クラスの{}が正しく閉じられているか
  • ifwhen{}が閉じられているか
  • forwhileなどのループが閉じられているか
  • ラムダ式の閉じ波括弧を忘れていないか
  • ネストしたブロックの波括弧の数と位置が正しいか
  • 必要な}をコメントアウトしていないか
  • 文字列の引用符やコメントを閉じ忘れていないか
  • エラー行より前のコードに構文エラーがないか
  • ファイルの最後までにすべてのブロックが閉じられているか

特に、エラーがファイルの末尾に表示されている場合は、それより前のどこかで開いた{が閉じられていない可能性があります。

まとめ

Kotlinの「Expecting ‘}’」は、コンパイラがコードを解析した際に、閉じ波括弧}が必要であるにもかかわらず見つからない場合などに表示される構文エラーです。

代表的な原因には、関数、クラス、ifwhen、ループ、ラムダ式などの閉じ波括弧の不足や、ネストしたブロックの対応ミスがあります。

また、文字列の引用符やコメントの閉じ忘れなど、波括弧以外の構文エラーによって「Expecting ‘}’」が表示される場合もあります。

基本的には、{}の対応を確認し、インデントを整えながら各ブロックが正しく閉じられているか確認することで解決できます。

「Expecting ‘}’」が表示されたときは、エラー位置だけを見るのではなく、「どこで開いたブロックがまだ閉じられていないのか」を確認しながら、それ以前のコードも含めて調べると原因を見つけやすくなります。