PC パソコン

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

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

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

原因としては、関数呼び出しや条件式、関数定義などで使用する丸括弧()の閉じ忘れや、引数・演算子・引用符などの記述ミスによって構文の対応関係が崩れていることなどが考えられます。

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

「Expecting ‘)’」とは

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

例えば、関数呼び出しの閉じ括弧を書き忘れると発生することがあります。

println("Hello"

このコードでは、println()の呼び出しを閉じる)がありません。

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

println("Hello")

原因1:関数呼び出しの閉じ丸括弧を忘れている

もっとも基本的な原因の一つは、関数呼び出しを閉じる)を書き忘れていることです。

printMessage("Hello"

この場合、関数呼び出しを開始する(に対応する)がありません。

関数呼び出しの最後に閉じ丸括弧を追加します。

printMessage("Hello")

原因2:if文の条件式の丸括弧を閉じ忘れている

if文の条件を囲む丸括弧が閉じられていない場合も、「Expecting ‘)’」が表示されることがあります。

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

この例では、条件式age >= 18を閉じる)がありません。

条件式の最後に閉じ丸括弧を追加します。

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

原因3:when式の対象を囲む丸括弧を閉じ忘れている

when式で対象となる値を丸括弧で囲んでいる場合、その閉じ括弧が不足すると構文エラーになります。

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

このコードでは、valueの後に閉じ丸括弧がありません。

正しく閉じます。

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

原因4:関数定義の引数部分を閉じ忘れている

関数を定義するときに使用する丸括弧()の閉じ忘れでも、「Expecting ‘)’」が表示されることがあります。

fun add(a: Int, b: Int {
    return a + b
}

この例では、引数abを囲む丸括弧が閉じられていません。

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

fun add(a: Int, b: Int) {
    return a + b
}

原因5:複数の関数呼び出しで括弧の対応が崩れている

関数の中で別の関数を呼び出すようなコードでは、丸括弧が複数重なるため、閉じ忘れが起こりやすくなります。

println(calculate(10, 20)

このコードでは、calculate()を閉じる丸括弧はありますが、println()を閉じる丸括弧が不足しています。

それぞれの開き括弧に対応する閉じ括弧があるか確認します。

println(calculate(10, 20))

原因6:引数の途中に構文エラーがある

閉じ丸括弧自体が存在していても、関数の引数部分に構文エラーがあると、コンパイラが括弧を正しく認識できず「Expecting ‘)’」が表示されることがあります。

showMessage("Hello", name = )

この例では、name =の後に必要な値がありません。

必要な値を指定します。

showMessage("Hello", name = "Taro")

エラーが閉じ丸括弧付近に表示されていても、実際にはその前の引数記述が原因の場合があります。

原因7:不要なカンマがある

関数呼び出しや引数定義の途中に不要なカンマがあると、コンパイラが次の要素を期待して構文解析に失敗することがあります。

showMessage("Hello", , "World")

この場合、2つのカンマの間に引数がありません。

不要なカンマを削除します。

showMessage("Hello", "World")

原因8:演算子の右側に式がない

丸括弧内の条件式や計算式が途中で終わっている場合も、構文解析が崩れて「Expecting ‘)’」が表示されることがあります。

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

この例では、比較演算子>=の右側に値がありません。

必要な値を追加します。

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

原因9:文字列の引用符を閉じ忘れている

実際には丸括弧が存在していても、その前に文字列の引用符を閉じ忘れていると、コンパイラが後続の)を正しく認識できない場合があります。

println("Hello)

この例では、閉じ丸括弧はありますが、文字列を閉じる引用符"が不足しています。

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

println("Hello")

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

原因10:コメントの位置によってコードが途中で切れている

コメントを追加した際に、必要なコードの一部がコメントとして扱われると、丸括弧の対応関係が崩れることがあります。

println(
    "Hello"
    // )

このように必要な閉じ丸括弧をコメントに含めてしまうと、コンパイラから見て)が存在しない状態になります。

コメントの範囲を確認し、必要な丸括弧がコメントアウトされていないか確認します。

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

「Expecting ‘)’」は、実際に丸括弧を書き忘れた位置ではなく、その後の行や別の構文の位置に表示されることがあります。

コンパイラはコードを順番に解析するため、開いた丸括弧が閉じられないまま後続のコードへ進むと、別の位置で閉じ丸括弧を期待してエラーを表示する場合があります。

そのため、エラーが表示された行だけではなく、その直前の関数呼び出しや条件式、関数定義なども確認する必要があります。

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

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

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

ただし、数が同じでも閉じる位置が間違っていると、構文が正しく解析されない場合があります。

丸括弧は数だけではなく、「どの式や関数呼び出しを閉じているか」を確認することが重要です。

複雑な式を分割して確認する

複数の関数呼び出しや条件が一つの式に含まれている場合は、コードを一時的に分割すると原因を確認しやすくなります。

val result = calculate(10, 20)

println(result)

一つの行に多くの丸括弧があるコードを複数の処理へ分けることで、どの括弧の対応が崩れているのか確認しやすくなります。

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

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

関数呼び出しが何重にもネストしている場合などは、この機能を利用すると閉じ忘れを確認しやすくなります。

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

「Expecting ‘)’」が表示された場合は、開いた丸括弧が正しく閉じられているかを中心に確認します。

  • 関数呼び出しの()が正しく閉じられているか
  • ifwhenの丸括弧が閉じられているか
  • 関数定義の引数部分の()が閉じられているか
  • ネストした関数呼び出しの括弧の数と位置が正しいか
  • 引数の途中で値や式が抜けていないか
  • 不要なカンマが残っていないか
  • 演算子の右側に必要な式があるか
  • 文字列の引用符を閉じ忘れていないか
  • 必要な)をコメントアウトしていないか
  • エラー行より前のコードに構文エラーがないか

特に、エラーが本来の丸括弧とは離れた位置に表示されている場合は、それより前に開いた(が閉じられていない可能性があります。

まとめ

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

代表的な原因には、関数呼び出し、ifwhenの条件、関数定義などで使用する丸括弧の閉じ忘れや、ネストした関数呼び出しでの括弧の対応ミスがあります。

また、引数の不足、演算子の記述ミス、文字列の引用符の閉じ忘れなど、丸括弧以外の構文エラーによって「Expecting ‘)’」が表示される場合もあります。

基本的には、()の対応を確認し、引数や条件式の構文も含めて正しく記述されているか確認することで解決できます。

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