<b>诊断Java代码: 将时态逻辑用于错误情势</b>[Java编程]
本文“<b>诊断Java代码: 将时态逻辑用于错误情势</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
固然传统的断言可以增添对 Java 代码所作的查抄次数,但仅用它们,还是有很多查抄无法完成.处理这种情形的办法之一就是利用 时态逻辑.请回想上个月的文章“ Assertions and temporal logic in Java programming”,时态逻辑有助于供应比程序中的办法更有力的断言,从而有助于加强用别的方法难以正式表达的不变量.
我们没必要吃力搜索去发现有助于避免我们程序出错的很多有效的不变量.实际上,可以通过利用此类时态逻辑断言来加大我们消除一些最常见错误情势的力度.在本文中,我们将研究一些错误情势,利用时态逻辑能会对它们产生最主动的影响.我们将把下列错误情势用作示例:
吊挂复合(Dangling Composite).当您的软件抛出空指针非常时这个错误发生,因为递归数据范例的错误表示,所以这是个难以诊断的问题.
破坏者数据(Saboteur Data).这种错误在已存储的数据不能满意某些句法或语义约束时发生;此时软件会因为代码操作的数据中的错误而不是编码中的错误而崩溃.
Split Cleaner.当资源的获得和释放按办法边界一分为二,答应某些掌握流不释放它们本该释放的资源,其表现情势为泄露或过早地释放它们时,这种错误发生.
孤线程(Orphaned Thread).当主线程抛出非常而剩余线程持续运行,并等候更多输入到该行列时,这种错误发生;这种错误大概招致程序冻结.
臆想实现.当您“实现”了接口,但实际上没有满意其预期的语义时,这种错误发生.
吊挂复合错误情势
吊挂复合错误情势包含递归数据范例的错误表示、将一些范例的基本情形表示为空值而非单独的类.这样做会招致难以诊断的 NullPointerException .
比方,假定您成立了下列“讨厌的”数据范例来表示二叉树:
清单 1. 一些非常糟糕的树
public class Tree {
public int value;
public Tree left;
public Tree right;
// Leaves are represented as Trees
// with null branches.
public Tree(int _value) {
this.value = _value;
this.left = null;
this.right = null;
}
public Tree(int _value, Tree _left, Tree _right) {
this.value = _value;
this.left = _left;
this.right = _right;
}
}
大家注意,除了作为糟糕的示例,请不要将这个代码用于任何别的用处!
这段代码造成了吊挂复合.二叉树叶子被表示为左右分支都是空值的 Tree.假如我们尝试向下递归这样的树,大概很简单引发 NullPointerException
避免这种错误情势的最佳办法是:将数据范例的表示重构为 Composite 类层次构造(请在 参考资料一节参阅关于这个主题的文章).假定您刚好已经完成了这样的重构,以下所示:
以上是“<b>诊断Java代码: 将时态逻辑用于错误情势</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |