我在这做错了什么?
fun main(args: Array<String> = arrayOf("abc")) {
val a = args[0]
}
Run Code Online (Sandbox Code Playgroud)
编译好但是:
线程"main"中的异常java.lang.ArrayIndexOutOfBoundsException:0
我想让它成为一个参数可选,如果没有指定则提供默认值
这可能不起作用,因为底层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)
归档时间: |
|
查看次数: |
53 次 |
最近记录: |