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

使用Gradle自定义插件时出现Null property空指针异常该如何解决?

问题根因

你遇到的空指针是因为Gradle没有为扩展接口中的myValue属性自动生成Property实例,核心问题是你将Property类型的属性错误声明为了var,且遗漏了Gradle托管扩展的写法要求,不属于官方文档错误。

Property是Gradle提供的可变值容器,本身支持读写操作,在扩展中仅需要声明为val暴露getter即可,声明为var时Gradle会认为你需要自行管理整个Property实例的赋值,不会自动生成实例。

正确实现方案

方案1:使用抽象类声明扩展(兼容性最好,无需额外配置)

Gradle对抽象类的托管属性支持最稳定,适合大多数场景:

  1. 修改扩展定义
abstract class MyExtension {
    // 注意用val而非var
    abstract val myValue: Property<String>
}
  1. 插件代码无需调整
class MyPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        val extension = project.extensions.create<MyExtension>("myExt")
    }
}
  1. build.gradle.kts侧的配置代码保持原有写法即可正常运行。

方案2:手动初始化Property(全版本兼容)

如果你需要完全控制属性初始化,不依赖Gradle自动托管,可以使用该写法:

  1. 修改扩展定义
class MyExtension(objects: ObjectFactory) {
    val myValue: Property<String> = objects.property(String::class.java)
}
  1. 调整插件中扩展创建逻辑,传入ObjectFactory实例
class MyPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        val extension = project.extensions.create(
            "myExt",
            MyExtension::class.java,
            project.objects
        )
    }
}

方案3:接口声明扩展(需满足版本要求)

如果坚持使用接口,需要将属性改为val,且确保插件项目已正确依赖gradleApi()、使用Gradle 6.0+版本:

interface MyExtension {
    val myValue: Property<String>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:24:03