将 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");
    }

作为结果,测试通过了,因为 expectedactual 是相等的。它等于因为在方法 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,而不是传递给函数的原始变量。