几天前,我在考试中遇到了以下理论问题:
(a)解释在处理时防御性编程的含义
执行某项操作时可能发生的特殊情况
程序。您可以参考在课堂上看到的示例或使用伪
代码以描述为防止某些情况而采取的步骤
例如在尝试读取文件时发生错误。
[5分]
(b)简要概括地描述异常处理的含义
Java以及与防御性编程有何不同。
[5分]

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

最佳答案

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

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

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或空保护子句;这是一个私有方法,因此您应该确保不会用null或空集合调用它
尝试捕获NoSuchElementException;您可以证明,如果迭代器履行其合同,则其中包含的代码将永远不会引发此异常。
从迭代器出来的字符串(第一个字符串除外)的无效保护子句;再次,由于这是一个私有方法,您应该应该能够确保collection参数不包含任何空值(无论如何,您将如何将空值放入集合中?)


并非所有人都同意零钱支票具有防御性。尝试捕获是完全没有意义的。

对我而言,防御性编程的严峻考验是您认为永远不会使用防御性。

07-27 17:17