LoginSignup
2
1

IntelliJでkotlinのmainメソッドが実行できない

Last updated at Posted at 2023-06-20

結論

以下をして出てくるようになった。

  1. ソースルートを設定
  2. ファイルタイプが「kotlinファイル/クラス」>「ファイル」のファイルに、クラスを作らずmainメソッドを記述

事象

intelliJでkotlinのプロジェクトを作成して、アプリケーションを実行するなどを見ながらmainメソッドを実行しようとするも、「実行」メニュー > 「実行」がアクティブにならない。
mainメソッドのあるファイルの行数ゾーンに緑の▶も出てこない。

対応

1. ソースルートを設定

ソースルート:コンパイルする必要のあるコードを置く最上位のディレクトリ
 ・参考:コンテンツルート

mainというディレクトリの配下にパッケージを構成していたが、このmainディレクトリをソースルートに設定した。
 ・mainディレクトリで右クリック
 ⇒「ディレクトリをマーク」
 ⇒「ソースディレクトリ」

2. ファイルタイプが「kotlinファイル/クラス」>「ファイル」のファイルに、クラスを作らずmainメソッドを記述

Main.kt「クラス」にmainメソッドを作成していたが、
Main.kt「ファイル」にmainメソッドを直接記述した(intelliJ語をそのまま使っているため語の定義は悪しからず...)。
 ・ファイル作成時に「kotlinファイル/クラス」>「ファイル」を選んで、Main.ktファイルを作成
 ⇒ファイルにmainメソッドを定義

参考

チュートリアル: 最初の Kotlin アプリケーションを作成する

最後に

とりあえず動いた方法のメモ

追記

Kotlinのエントリポイントの話 を拝読していて、当初「クラス」のファイルタイプで動かなかった理由が判明したため追記。

記述していたmainメソッドがエントリポイントになっていなかった
→インスタンスメソッドになっていた(companion object内で定義できていないなかった。Javaでいうとstatic化できていなかった(に近い))

では、どうしたら「クラス」のファイルタイプで動かせるか。

  • companion objectを定義し、その中でmainメソッドを定義する必要があった。
    (対象クラスをインスタンス化せずとも呼び出せるようにする必要があった(考えてみれば当然ですね...))
  • @JvmStaticをmainメソッドに付与する必要があった。
    (companion objectの定義は、デフォルトだとコンパイル時に専用の別クラスに切り出される(言語仕様)ため、mainメソッドを対象クラスの定義としてコンパイルしてもらう必要がある)

↑により実行用の緑の▶ も表示されるようになりました
image.png

参考
kotlinlang Companion objects

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1