几天前,我在考试中遇到了以下理论问题:
(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参数不包含任何空值(无论如何,您将如何将空值放入集合中?)
并非所有人都同意零钱支票具有防御性。尝试捕获是完全没有意义的。
对我而言,防御性编程的严峻考验是您认为永远不会使用防御性。