几天前,我有以下关于考试的理论问题:(a)在处理程序执行过程中可能发生的特殊情况时,解释什么是防御性编程。您可以参考类中的示例,或者使用伪代码来描述在尝试读取文件时为防止某些情况发生而采取的步骤。5分
(b)概括地描述Java中异常处理的含义,以及这与防御性编程的不同之处。5分
我一直认为防御性编程是编程的整个范例,而异常处理则是其中的一部分。在考试期间,我写到,在“防御性编程”中,程序员试图在执行逻辑代码之前找出所有可能的问题,然后再从这个函数返回错误值(示例0),而在异常处理中,可能发生的错误会发生,并被特殊的机制捕获,在这种机制中,这些错误被直接解释。是对的吗?正确的答案应该是什么?
发布于 2011-09-22 18:14:23
对我来说,防御性编程意味着编写代码来处理那些你认为不会发生,甚至可能发生的情况,因为你相信自己的信念是不可靠的。
例如(未经汇编或测试,条款和条件适用):
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;
}
}在那里,可以说是防御性特征包括:
- NoSuchElementException;您可以证明,如果迭代器履行了它的约定,它包含的代码永远不会抛出这个异常。
?
并不是每个人都同意无效支票是防御性的。尝试捕获是完全没有意义的。
对我来说,防御性编程的严峻考验是你认为防守永远不会被使用。
发布于 2011-09-22 18:20:02
对我来说,防御性编程假设了最坏的情况:你的用户是完全疯狂的人,你必须保护自己和你的程序不受他们疯狂的输入的影响。我相信这句话有很多智慧:
每一天,软件业都在制造越来越大更好的防伪软件,而每一天,大自然都在制造越来越大更好的傻瓜。到目前为止,大自然正在获胜。
永远不要忘记你的用户不仅仅是你的客户。如果您负责一个库API,您的用户可能是其他部门。在这种情况下,我一生中听到的最强烈的抱怨之一是:
,即使在我们删除了所有失败的单元测试之后,程序也无法运行
。
https://stackoverflow.com/questions/7519299
复制相似问题