Java 静态最终字段不应为空';T
我们的应用程序中有一些代码使用Java,另一些代码使用Kotlin。我们遇到了一个非常奇怪的情况 问题出现在一些设备上,在将其传递给Java 静态最终字段不应为空';T,java,android,kotlin,interop,auto-value,Java,Android,Kotlin,Interop,Auto Value,我们的应用程序中有一些代码使用Java,另一些代码使用Kotlin。我们遇到了一个非常奇怪的情况 问题出现在一些设备上,在将其传递给AutoValue\u会话构造函数时,尽管我们检查lastform是否为null并提供常量platform,但它报告platform为null。缺少否则: Caused by java.lang.NullPointerException: Null lastPlatform x.x.x.x.AutoValue_Session.(SourceFile:27) x.x.
AutoValue\u会话
构造函数时,尽管我们检查lastform
是否为null
并提供常量platform,但它报告platform
为null
。缺少否则:
Caused by java.lang.NullPointerException: Null lastPlatform
x.x.x.x.AutoValue_Session.(SourceFile:27)
x.x.x.x.Session.from(SourceFile:28) // from that calls the child constructor
x.x.x.x.Session.(SourceFile:22) // whereNONE_FOUND is defined
x.x.x.x.Session.from(SourceFile:32) // entry point
[...]
有人对Android和Kotlin interop有过这个问题吗
更新:这种情况发生在野外,只有很少的用户。还不能在本地复制它
更新2:对会话的第二次调用。from
是由会话的
第一次加载到内存中引起的
下面是提到的两个类的代码:
Platform.kt
sealed class Platform {
abstract val name : String
sealed class Local : Platform() {
object Default : Local() {
override val name: String = "android"
}
object Amazon : Local() {
override val name: String = "android-amazon"
}
}
object Missing : Platform() {
override val name: String = "missing"
}
data class Remote(override val name: String) : Platform()
companion object {
@JvmName("from")
@JvmStatic
operator fun invoke(name: String?): Platform = when (name) {
Local.Default.name -> Local.Default
Local.Amazon.name -> Local.Amazon
Missing.name -> Missing
null -> Missing
else -> Remote(name)
}
@JvmField
val LOCAL : Platform = if (BuildConfig.amazon) Local.Amazon else Local.Generic
@JvmField
val MISSING : Platform = Missing
}
}
Session.java
@AutoValue
public abstract class Session implements Serializable {
public static final Session NONE_FOUND = from(0, new DateTime(0), Platform.MISSING);
public static Session from(String id, @Nullable Platform lastPlatform) {
Platform platform = lastPlatform == null ? Platform.MISSING : lastPlatform;
return new AutoValue_Session(id, platform);
}
public static Session from(RemoteSession remote) {
return from(
remote.id(),
remote.lastPlatform()
);
}
public abstract String id();
public abstract Platform lastPlatform();
}
(1) 您确定在异常发生之前,AutoValue\u会话
构造函数不能将lastPlatform
设置为null
?(2) 在构造函数调用中,参数名为platform
,在异常lastPlatform
中。您确定这些参数与同一参数相关吗?(3) 如果出现异常,您是否查看了生成的字节码?@MichaelButscher:(1)默认情况下,Autovalue会检查值是否为null:(2)会话
中定义的属性名为lastPlatform()
(3)我们在生成的代码上看不到任何异常。此外,忘了提到它只适用于我们的一小部分用户群,并且我们不能在本地复制它:(我找不到用于NONE_FOUND的from(int,DateTime,Platform)的任何定义。这会导致问题吗?