You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Java转Kotlin报错:No value passed for parameter 'init'

解决Kotlin中Array初始化报错:No value passed for parameter 'init'

这是Kotlin新手常踩的坑,核心原因是Kotlin的数组初始化逻辑和Java有本质区别,我来帮你理清楚:

错误原因拆解

你的Java代码里new TextView[layouts.length]是直接创建一个指定长度、所有元素默认为null的数组,但Kotlin的空安全机制对非空类型有严格限制:

  • 你声明的dots是Array<TextView>,这意味着数组里的每一个元素都不能为null
  • Kotlin的Array主构造函数必须传入两个参数:size(数组长度)和init(一个lambda,用来初始化数组的每一个元素,确保元素非空)
  • 你只传了size参数,没提供初始化逻辑,所以编译器直接抛出No value passed for parameter 'init'的错误

两种解决方案(根据你的业务逻辑选择)

方案1:和Java原逻辑完全对齐(允许数组元素为null)

如果你的代码是先创建空数组,后续再逐个给元素赋值(和Java逻辑一致),那需要把数组类型改成可空类型,并使用Kotlin专门提供的arrayOfNulls函数来创建元素为null的数组:

private lateinit var dots: Array<TextView?> // 将类型改为可空的TextView数组
private lateinit var layouts: IntArray
private fun addBottomDots(currentPage: Int) {
    dots = arrayOfNulls<TextView>(layouts.size) // 创建指定长度、元素默认是null的数组
    // 后续你可以像Java一样给dots[index]赋值,比如 dots[0] = TextView(this)
}

方案2:使用非空类型(强制初始化每个元素)

如果不想用可空类型,必须在创建数组时就给每个元素赋值一个非null的TextView实例,利用Array的构造函数传入初始化lambda即可:

private lateinit var dots: Array<TextView>
private lateinit var layouts: IntArray
private fun addBottomDots(currentPage: Int) {
    // 假设当前上下文是Activity/Fragment,用this获取Context
    dots = Array(layouts.size) { TextView(this) }
    // 后续可以按需修改这些TextView的样式、文本等属性
}

额外说明

lateinit关键字只是用来延迟初始化dots这个变量本身,它不影响数组内部元素的初始化规则——Kotlin依然要求数组元素必须符合你声明的类型约束(非空/可空)。

内容的提问来源于stack exchange,提问作者ruhulrahat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:08:27