【问题标题】:Kotlin - use compiled regex inside init block throws null pointer exceptionKotlin - 在 init 块中使用编译的正则表达式会引发空指针异常
【发布时间】:2020-08-16 21:46:15
【问题描述】:

我在 Kotlin 中有以下数据类

data class AppInfoBO constructor(
        val appVersion: String
) {
    val majorVersion: Int?
    val minorVersion: Int?
    init {
        val matches = majorVersionRegex.find(appVersion)
        if (matches != null) {
            majorVersion = matches.groups[1]?.value?.toInt()
            minorVersion = matches.groups[2]?.value?.toInt()
        } else {
            majorVersion = null
            minorVersion = null
        }
    }

    companion object {
        @JvmField
        val UNKNOWN = AppInfoBO("UNKNOWN")

        @JvmStatic
        val majorVersionRegex = Regex("""(\d+)\.(\d+)\.""")
    }

当我尝试运行它时,它抱怨伴随对象内的majorVersionRegex 为空。

如果我将 majorVersionRegex 移动到 kotlin 对象中,它可以正常工作。

    private object RegexHolder {
        val majorVersionRegex = Regex("""(\d+)\.(\d+)\.""")
    }

我正在尝试将 majorVersionRegex 设为静态变量,因此不需要一遍又一遍地编译正则表达式。

有没有更好的方法呢?这真的感觉像是一个 hack。

【问题讨论】:

  • 一开始我认为这看起来不错,正如预期的那样,我在测试时是unable to reproduce this。也许更多细节会有所帮助?你是如何创建这个数据类的实例的?
  • 如果您尝试在伴随对象中初始化常量 AppInfoBO 并且在声明正则表达式之前,将会有一个 NPE。不确定这是否是您的情况,但您可以将声明移到正则表达式之后。
  • @Nicolas 你成功了!!考虑到我原来的帖子忽略了这一点,非常令人印象深刻!如果你想写一个答案,我很乐意给你信用!

标签: kotlin


【解决方案1】:

根本原因是您在定义majorVersionRegex 之前尝试初始化状态val UNKNOWN = AppInfoBO("UNKNOWN")

解决方法是将majorVersionRegex 移到UNKNOWN 上方。

    companion object {
        @JvmStatic
        val majorVersionRegex = Regex("""(\d+)\.(\d+)\.""")

        @JvmField
        val UNKNOWN = AppInfoBO("UNKNOWN")
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多