I tried to compile the javax.script example from the Kotlin web site.
import javax.script.*
fun main () {
val engine = ScriptEngineManager().getEngineByExtension("kts")!!
engine.eval("val x = 3")
println (engine.eval("x + 2")) // Prints out 5
}
But it throws a NullPointerException
:
$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -jar hello.jar
Exception in thread "main" java.lang.NullPointerException
at HelloKt.main(hello.kt:4)
at HelloKt.main(hello.kt)
Does anybody know what is wrong here? Do I need some additional compile options?
I am using:
kotlinc-jvm 1.4.10 (JRE 11.0.9+11-post-Debian-1deb10u1)
Update: some more tests
$ kotlinc-jvm hello.kt
$ kotlin HelloKt
Exception in thread "main" java.lang.NoClassDefFoundError: javax/script/ScriptEngineManager
at HelloKt.main(hello.kt:4)
at HelloKt.main(hello.kt)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
Caused by: java.lang.ClassNotFoundException: javax.script.ScriptEngineManager
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 9 more
$ kotlin -cp .:kotlin-stdlib.jar:kotlin-main-kts.jar:kotlin-compiler.jar:livetribe-jsr223.jar HelloKt
Exception in thread "main" java.lang.NullPointerException
at HelloKt.main(hello.kt:4)
at HelloKt.main(hello.kt)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:64)
at org.jetbrains.kotlin.runner.Main.run(Main.kt:149)
at org.jetbrains.kotlin.runner.Main.main(Main.kt:159)
$ java -cp .:kotlin-stdlib.jar:kotlin-main-kts.jar:kotlin-compiler.jar:livetribe-jsr223.jar HelloKt
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory not found
ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider org.jetbrains.kotlin.mainKts.jsr223.KotlinJsr223MainKtsScriptEngineFactory could not be instantiated
Exception in thread "main" java.lang.NullPointerException
at HelloKt.main(hello.kt:4)
at HelloKt.main(hello.kt)
NullPointerException
s everywhere, although "Kotlin's type system is aimed to eliminate NullPointerException's from our code".
Funny. Somehow.
Update: Java example
I want to port the following Java/Groovy example to Kotlin/Kotlin.
Sourceimport groovy.util.Eval;
public class MetaEval
{
public static void main (String... args)
{
System.out.println (Eval.me ("2+3"));
}
}
Compile
$ /usr/lib/jvm/java-8-openjdk-amd64/bin/javac -cp .:/usr/share/java/groovy-all.jar MetaEval.java
Run
$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp .:/usr/share/java/groovy-all.jar MetaEval
5