首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防御性编程和异常处理

防御性编程和异常处理
EN

Stack Overflow用户
提问于 2011-09-22 17:58:44
回答 2查看 3.6K关注 0票数 10

几天前,我有以下关于考试的理论问题:(a)在处理程序执行过程中可能发生的特殊情况时,解释什么是防御性编程。您可以参考类中的示例,或者使用伪代码来描述在尝试读取文件时为防止某些情况发生而采取的步骤。5分

(b)概括地描述Java中异常处理的含义,以及这与防御性编程的不同之处。5分

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

EN

回答 2

Stack Overflow用户

发布于 2011-09-22 18:14:23

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

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

代码语言:javascript
复制
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;您可以证明,如果迭代器履行了它的约定,它包含的代码永远不会抛出这个异常。

  • 是字符串上的无效保护子句(第一个除外!)再次指出,由于这是一个私有方法,您可能应该能够确保集合参数不包含空(以及您将如何在集合中放置空值?)

并不是每个人都同意无效支票是防御性的。尝试捕获是完全没有意义的。

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

票数 2
EN

Stack Overflow用户

发布于 2011-09-22 18:20:02

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

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

永远不要忘记你的用户不仅仅是你的客户。如果您负责一个库API,您的用户可能是其他部门。在这种情况下,我一生中听到的最强烈的抱怨之一是:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7519299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档