我对这段结合了 Kotlin 和 Java 的代码有疑问。当我运行 main 方法时,它运行良好。但是,当我在调试模式下运行它时,我遇到了 it.adminRole 的 NullPointerException 异常,但没有遇到 it.function 的异常。我需要对此进行解释。
public class Role {
public String function;
public Boolean adminRole;
public Role(){
}
public Role(String function, Boolean adminRole) {
this.function = function;
this.adminRole = adminRole;
}
}
public class User {
public String name;
public String surname;
public Role role;
public User(){
}
public User(String name, String surname, Role role) {
this.name = name;
this.surname = surname;
this.role = role;
}
}
fun User.getUser(): TestUser? =
this.role?.let {
TestUser(
adminRole = it.adminRole, //in debug mode i get NullPointerException( i want to understand why??)
function = it.function, //in debug mode i get null value
)
}
fun main() {
val user = User().apply {
role = Role()
}
user.getUser()
}
data class TestUser(
val adminRole: Boolean? = null,
val function: String? = null,
)
Java 对象引用类型,如 Boolean,默认初始化为 null。如果您希望它具有非空初始值,您应该在构造函数中这么说。
我会尝试这个:
public class Role {
public final String function;
public final Boolean adminRole;
public Role() {
this("", Boolean.False);
}
public Role(String function, Boolean adminRole) {
this.function = function;
this.adminRole = adminRole;
}
}
不建议使公共变量可变。我将两者都标记为final,以防止初始化后修改。
我还建议您的默认构造函数调用完整的构造函数并详细说明默认值。它让你的意图更加清晰。这意味着您考虑了默认构造函数,而不是让 IDE 自动为您生成它。