开发者社区 问答 正文

关于程序健壮性的一点疑问:报错

有一个公共的方法(公共的意思是可能被好多人调用吧)

里面只有一行语句

public void method1(A a) {

    a.getField().getField.getField.setField(a.getField().getField.getField.getField() + 1);

}

这里如果传进来的a为null的话,就空指针异常了。或者a的属性为null的话,也会空指针。

在写程序的时候,有没有必要写if (a != null || a.getField() != null .....呢?

你们在写程序的时候,这些都写吗?

展开
收起
kun坤 2020-06-14 09:15:56 327 分享 版权
阿里云 AI 助理回答

在编写程序时,确实需要考虑空指针异常的风险,并采取相应的预防措施。直接在方法中抛出空指针异常可能会导致上层调用方的不稳定,尤其是在公共方法中,因为它们可能被多个地方调用,且调用者可能预期该方法能更健壮地处理输入。

对于你提到的方法,一种常见的做法是进行防御性编程,即在访问对象属性之前检查对象是否为null。这可以通过添加一系列的非空检查来实现,如:

public void method1(A a) {
    if (a == null) {
        return; // 或者抛出自定义异常,告知调用者传入的对象为空
    }
    
    Field field1 = a.getField();
    if (field1 == null) {
        return; // 同样,可以选择处理或抛异常
    }
    
    Field field2 = field1.getField();
    if (field2 == null) {
        return;
    }
    
    Field field3 = field2.getField();
    if (field3 == null) {
        return;
    }
    
    field3.setField(field3.getField().getField() + 1);
}

这样做的确会增加代码量,但提高了程序的健壮性,减少了运行时异常的可能性。在实际开发中,是否每个层级都做检查取决于具体场景、性能考量以及团队的编码规范。有时,如果一个对象的某些字段不应该为null,那么在设计阶段就应确保这一点,或者在对象构造时进行初始化,减少null检查的需要。

另外,Java 8引入了Optional类,可以进一步优雅地处理潜在的null值问题,使得代码更加可读和健壮:

public void method1(A a) {
    Optional.ofNullable(a)
            .map(A::getField)
            .map(Field::getField)
            .map(Field::getField)
            .ifPresent(field3 -> field3.setField(field3.getField().getField() + 1));
}

这种方式避免了深度嵌套的if语句,使代码更加清晰,同时表达了“如果有值则执行操作”的意图。

至于阿里云在编写代码时的实践,虽然我无法提供内部的具体细节,但通常遵循行业最佳实践,包括防御性编程、使用现代语言特性(如Java 8的Optional)来提升代码质量和稳定性。在阿里云的产品开发中,也会强调代码的可维护性和健壮性,确保服务的高可用性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: