10

几天前,我在考试中有以下理论问题: (a) 在处理程序执行过程中可能发生的异常情况时,解释防御性编程的含义。例如,您可以参考课堂上看到的示例或使用伪代码来描述为防止某些情况发生而采取的步骤,例如在尝试读取文件时。[5 分]

(b) 概括地简要描述 Java 中异常处理的含义以及它与防御性编程有何不同。[5分]

我一直认为防御性编程是整个编程范式,异常处理是其中的一部分。在考试期间,我在“防御性编程”中写道,程序员在执行逻辑代码之前尝试找出所有可能的问题,然后从这个函数返回错误值(示例 0),而在异常处理中,潜在的错误发生并被捕获通过特殊机制,直接解释这些错误。这样对吗?正确答案应该是什么?

4

2 回答 2

2

对我来说,防御性编程意味着编写代码来处理您认为不会发生甚至不可能发生的情况,因为您相信自己的信念是不可靠的。

例如(未编译或测试,适用条款和条件):

private String findSmallestString(Collection<String> strings) {
    if (strings == null || strings.isEmpty()) return null;
    Iterator<String> stringsIt = strings.iterator();
    try {
        String smallestString = stringsIt.next();
        while (stringsIt.hasNext()) {
            String candidateString = stringsIt.next();
            if (candidateString == null) continue;
            if (candidateString.compareTo(smallestString) < 0) {
                smallestString = candidateString;
            }
        }
        return smallestString;
    }
    catch (NoSuchElementException e) {
        return null;
    }
}

在那里,可以说是防御功能包括:

  • 顶部的空或空保护子句;这是一个私有方法,因此您应该确保永远不会使用 null 或空集合调用它
  • NoSuchElementException 的 try-catch;您可以证明,如果迭代器履行其合同,它包含的代码将永远不会抛出此异常。
  • 从迭代器出来的字符串(除了第一个!)上的无效保护子句;再一次,因为这是一个私有方法,你应该能够确保集合参数不包含空值(无论如何你会把空值放在集合中做什么?)

不是每个人都同意空检查是防御性的。try-catch 是完全没有意义的。

对我来说,防御性编程的严峻考验是你认为永远不会使用防御。

于 2011-09-22T18:14:23.663 回答
2

对我来说,防御性编程假设最坏的情况:你的用户完全是疯子,你必须保护自己和你的程序免受他们疯狂的输入。我相信这句话中有很多智慧:

软件行业每天都在制造更大更好的防呆软件,而大自然每天都在制造更大更好的傻瓜。到目前为止,大自然正在获胜

永远不要忘记您的用户不仅仅是您的客户。如果您负责图书馆 API,您的用户可能是其他部门。在那种情况下,我一生中听到的最重要的抱怨之一是:

即使我们删除了所有失败的单元测试,程序也无法运行

于 2011-09-22T18:20:02.907 回答