将 null 设置为对象但没有 NPE
Set null to object but no NPE
Java 8
public class OidDTO {
private String value;
public OidDTO(String value) {
this.value = value;
}
}
此处Junit测试:
@Test
public void change_object_by_ref() {
OidDTO oidDTO = new OidDTO("init_value");
changeOidDTO(oidDTO);
String expected = "new_value";
String actual = oidDTO.getValue();
assertEquals(expected, actual);
}
private void changeOidDTO(OidDTO oidDTO) {
oidDTO.setValue("new_value");
}
作为结果,测试通过了,因为 expected 和 actual 是相等的。它等于因为在方法 changeOidDTO
中我更改了值。
不错。
现在另一个测试:
@Test
public void change_object_by_ref() {
OidDTO oidDTO = new OidDTO("init_value");
changeOidDTO(oidDTO);
String expected = "new_value";
String actual = oidDTO.getValue(); // Why no NPE
assertEquals(expected, actual);
}
private void changeOidDTO(OidDTO oidDTO) {
oidDTO = null;
}
测试失败。
expected: <new_value> but was: <init_value>
Expected :new_value
Actual :init_value
如您所见,我在这一行中设置了空值:
oidDTO = null;
问题是:为什么不在下一行抛出NPE:
String actual = oidDTO.getValue()
?
你问为什么这一行没有NPE
String actual = oidDTO.getValue(); // Why no NPE
因为 oidDTO
不为空。
OidDTO oidDTO = new OidDTO("init_value");
这一行
changeOidDTO(oidDTO);
更改 LOCAL 变量 oidDTO
,而不是传递给函数的原始变量。
Java 8
public class OidDTO {
private String value;
public OidDTO(String value) {
this.value = value;
}
}
此处Junit测试:
@Test
public void change_object_by_ref() {
OidDTO oidDTO = new OidDTO("init_value");
changeOidDTO(oidDTO);
String expected = "new_value";
String actual = oidDTO.getValue();
assertEquals(expected, actual);
}
private void changeOidDTO(OidDTO oidDTO) {
oidDTO.setValue("new_value");
}
作为结果,测试通过了,因为 expected 和 actual 是相等的。它等于因为在方法 changeOidDTO
中我更改了值。
不错。
现在另一个测试:
@Test
public void change_object_by_ref() {
OidDTO oidDTO = new OidDTO("init_value");
changeOidDTO(oidDTO);
String expected = "new_value";
String actual = oidDTO.getValue(); // Why no NPE
assertEquals(expected, actual);
}
private void changeOidDTO(OidDTO oidDTO) {
oidDTO = null;
}
测试失败。
expected: <new_value> but was: <init_value>
Expected :new_value
Actual :init_value
如您所见,我在这一行中设置了空值:
oidDTO = null;
问题是:为什么不在下一行抛出NPE:
String actual = oidDTO.getValue()
?
你问为什么这一行没有NPE
String actual = oidDTO.getValue(); // Why no NPE
因为 oidDTO
不为空。
OidDTO oidDTO = new OidDTO("init_value");
这一行
changeOidDTO(oidDTO);
更改 LOCAL 变量 oidDTO
,而不是传递给函数的原始变量。