WEB开发网
开发学院软件开发Java 追求代码质量: 用 AOP 进行防御性编程 阅读

追求代码质量: 用 AOP 进行防御性编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 测试我的理论很容易;甚至都不用从头开始,仅仅把 {null, null} 添加到初始 BuildHierarchyTest 的 dataValues 方法中的多维 Object 数组中,追求代码质量: 用 AOP 进行防御性编程(3),然后再次运行它,我定会得到如图 1 所示的 NullPoin

测试我的理论很容易;甚至都不用从头开始。仅仅把 {null, null} 添加到初始 BuildHierarchyTest 的 dataValues 方法中的多维 Object 数组中,然后再次运行它。我定会得到如图 1 所示的 NullPointerException:


图 1. 可怕的 NullPointerException
追求代码质量: 用 AOP 进行防御性编程

图片看不清楚?请点击这里查看原图(大图)。

关于静态分析

诸如 FindBugs 等静态分析工具通过将字节码和一系列 bug 模式相匹配来检验类或 JAR 文件从而寻找潜在问题。针对样例的代码运行 FindBugs 不会 揭示出清单 1 中找到的 NullPointerException。

防御性编程

一旦出现这个问题,下一步就是要拿出对抗的策略。问题是我控制不了这个方法能否接收这种输入。对于这类问题,开发人员通常会使用防御性编程技术,该技术专门用来在发生摧毁性后果前捕捉潜在错误。

对象验证是处理不确定性的一项经典的防御性编程策略。相应地,我会添加一项检验来验证 clzz 是否为 null,如清单 3 所示。如果其值最终为 null,我就会抛出一个 RuntimeException 来警告他人注意这个潜在问题。


清单 3. 添加验证 null 值的检验

public static Hierarchy buildHierarchy(Class clzz){ 
 
 if(clzz == null){ 
 throw new RuntimeException("Class parameter can not be null"); 
 } 
 
 Hierarchy hier = new Hierarchy(); 
 hier.setBaseClass(clzz); 
 
 Class superclass = clzz.getSuperclass(); 
 
 if(superclass != null && superclass.getName().equals("java.lang.Object")){ 
 return hier; 
 }else{    
 while((clzz.getSuperclass() != null) && 
  (!clzz.getSuperclass().getName().equals("java.lang.Object"))){ 
   clzz = clzz.getSuperclass(); 
   hier.addClass(clzz); 
 }     
 return hier; 
 } 
}   

上一页  1 2 3 4 5 6 7 8  下一页

Tags:追求 代码 质量

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接