Указание аргументов по умолчанию для основного - PullRequest
0 голосов
/ 20 февраля 2019

Что я здесь не так делаю?

fun main(args: Array<String> = arrayOf("abc")) {
    val a = args[0]
}

компилируется нормально, но:

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 0

Я хочу сделать необязательным наличие аргумента и указание значения по умолчанию, если ничего не было указано

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я думаю, что это вопрос подписи в поиске JVM методов main: метод main должен иметь один параметр типа String[], и этот параметр получает значения из CLI;если CLI не предоставляет никаких параметров, метод main получает new String[0], что вызывает ошибку, с которой вы столкнулись.

Я думаю, что вы можете решить проблему, слегка изменив подход:

fun main(args: Array<String>) {
    println(args)
    val a = args.getOrElse(0) {"abc"}
    println(a)
}

должно работать для вашего сценария: если нет параметра с индексом 0 a возвращает значение по умолчанию, которое вы передали (как лямбда) в getOrElse.

0 голосов
/ 20 февраля 2019

Это, вероятно, не работает из-за того, как работает базовая платформа 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...