指定main的默认参数

yco*_*omp 4 kotlin

我在这做错了什么?

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

编译好但是:

线程"main"中的异常java.lang.ArrayIndexOutOfBoundsException:0

我想让它成为一个参数可选,如果没有指定则提供默认值

Jes*_*per 8

这可能不起作用,因为底层Java平台如何工作以及Kotlin如何将默认参数转换为JVM可以理解的内容.你可以说这是Kotlin的一个错误......

Java虚拟机查找具有以下签名的方法来运行您的程序(这是Java):

public static void main(String[] args)
Run Code Online (Sandbox Code Playgroud)

请注意,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" });
}
Run Code Online (Sandbox Code Playgroud)

运行程序时,JVM仍将使用String[] args参数查找方法.它将忽略没有参数的方法,该main方法是使用默认参数为Kotlin 方法生成的.

因此String[] args,即使命令行上没有参数,它总是会调用该版本 - 导致您获得的错误.

解决方法:不要对main方法使用默认值; 检查方法中是否给出了参数:

fun main(args: Array<String>) {
    val realArgs = if (args.size > 0) args else arrayOf("abc")

    // work with realArgs
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解释!我不相信我们可以说这是Kotlin的一个错误.命令行上没有参数意味着0个元素的数组,而不是缺少数组.因此,即使我们从支持默认参数的Kotlin代码调用这个`main`函数,我仍然相信这很自然地用一个空数组作为参数调用该函数. (2认同)