Это, вероятно, не работает из-за того, как работает базовая платформа Java и как Kotlin переводит аргументы по умолчанию в то, что JVM может понять.Вы можете сказать, что это ошибка в Kotlin ...
Виртуальная машина Java ищет метод с следующей сигнатурой для запуска вашей программы (это Java):
public static void main(String[] args)
Обратите внимание, чтоЗначения аргументов по умолчанию в Java не существуют, поэтому, если вы объявляете метод со значениями по умолчанию в Kotlin, компилятор Kotlin генерирует несколько методов в байт-коде Java, которые будут выглядеть следующим образом при преобразовании в Java:
public static void main(String[] args) {
// the normal main method
}
// generated because you have a method with default values
public static void main() {
main(new String[]{ "abc" });
}
При запуске программы JVM все равно будет искать метод с аргументом String[] args
.Он будет игнорировать метод без аргументов, который был сгенерирован для метода Kotlin main
с аргументами по умолчанию.
Так что он всегда будет вызывать версию String[] args
, даже если в команде нет аргументовстрока - ведущая к получаемой ошибке.
Обходной путь: Не используйте значения по умолчанию для метода main
;проверить, были ли заданы аргументы внутри метода:
fun main(args: Array<String>) {
val realArgs = if (args.size > 0) args else arrayOf("abc")
// work with realArgs
}