Search code examples
functionstaticjvmruntime-errorkotlin

ensure kotlin method is static, top level or annotated @JvmStatic


How do I declare main as static so that the method will run as below (interactive):

thufir@dur:~/kotlin$ 
thufir@dur:~/kotlin$ kotlinc
Welcome to Kotlin version 1.1.51 (JRE 9.0.0.15+181)
Type :help for help, :quit for quit
>>> 
>>> println("hello world");
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.intellij.util.text.StringFactory to constructor java.lang.String(char[],boolean)
WARNING: Please consider reporting this to the maintainers of com.intellij.util.text.StringFactory
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
hello world
>>> 
>>> :quit
thufir@dur:~/kotlin$ 

compiling:

thufir@dur:~/kotlin$ 
thufir@dur:~/kotlin$ kotlinc Hello.kt 
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.intellij.util.text.StringFactory to constructor java.lang.String(char[],boolean)
WARNING: Please consider reporting this to the maintainers of com.intellij.util.text.StringFactory
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
thufir@dur:~/kotlin$ 
thufir@dur:~/kotlin$ kotlin HelloKt
error: could not find or load main class HelloKt
thufir@dur:~/kotlin$ 
thufir@dur:~/kotlin$ kotlin Hello
error: 'main' method of class Hello is not static. Please ensure that 'main' is either a top level Kotlin function, a member function annotated with @JvmStatic, or a static Java method
thufir@dur:~/kotlin$ 
thufir@dur:~/kotlin$ cat Hello.kt 
class Hello {


    public fun main(args: Array<String>) {
        println("Hello, world!" + args[0])
    }
}
thufir@dur:~/kotlin$ 

see also:

https://kotlinlang.org/docs/tutorials/command-line.html


Solution

  • In the tutorial, the method is declared on top level, not inside class Hello. Alternately, you can write

    import kotlin.jvm.JvmStatic
    
    object Hello {
        @JvmStatic
        public fun main(args: Array<String>) {
            println("Hello, world!" + args[0])
        }
    }