这似乎是一件非常简单的事情,但我无法找到如何阻止错误。在repairDetails
变量的if里面,我收到一个错误,说它已经在范围内定义了。我怎么会绕过这个,好像它是null我仍然想要使用那个变量,但把它设置为下面的其他东西。
Realm realm = Realm.getDefaultInstance();
RepairDetails repairDetails = realm.where(RepairDetails.class).equalTo("deviceId", device.id).findFirst();
if(repairDetails == null){
RepairDetails repairDetails = new RepairDetails();
}
答案 0 :(得分:11)
为什么我的代码在这里被破坏了?
当Java编译器再次看到列出的类型时,
RepairDetails repairDetails = new RepairDetails();
它假设您正在尝试定义变量。但是,您已在外部作用域中访问该变量。
正确的代码只会删除类型,允许您分配repairDetails。
if(repairDetails == null){
repairDetails = new RepairDetails();
}
将repairDetails = new RepairDetails();
转换为赋值,而不是变量声明。
(与此相关,但是在有人遇到此问题并认为他们之前已经看过它之后通常会出现一个问题)
当外部范围是成员或超级成员时,为什么可以呢?
https://docs.oracle.com/javase/tutorial/java/javaOO/variables.html有一个部分提到声明成员变量,但局部变量的行为类似,除非它们包含在它们定义的方法/大括号的范围内,而不是上课。
有几次Java允许从作用域中冲突变量名称,就是它是一个覆盖成员变量的局部变量。 (参数也是局部变量),或者涉及继承。
它被称为隐藏。 https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html
方法也可以隐藏。 https://docs.oracle.com/javase/tutorial/java/IandI/override.html
但这种行为也不是你所期望的。
这是不可避免的原因,成员可以通过继承覆盖,超类可以定义以前在子类的本地范围内使用的成员。
所以Java设计者允许隐藏,因为它是2个邪恶中较小的一个,考虑到你可以通过在变量名前加上
来消除超级成员,类成员和本地人之间的歧义。this.repairDetails
,super.repairDetails
,repairDetails
答案 1 :(得分:6)
问题在于您正在尝试定义新变量。
更改
if(repairDetails == null){
RepairDetails repairDetails = new RepairDetails();
}
到
if(repairDetails == null){
repairDetails = new RepairDetails();
}
它应该有效。
您不需要第二次输入类型,这就是您收到错误的原因。
答案 2 :(得分:4)
只需删除if:
中的第二个声明RepairDetails repairDetails = new RepairDetails();
实际上应该是:
repairDetails = new RepairDetails();
这样你就可以覆盖先前声明的变量,而不是在范围内创建一个新变量。