断言与防御式编程

1 断言

1.1 断言的含义

断言:在开发阶段的代码中嵌入,检验某些条件是否成立,如果成立,程序运行正常,否则会抛出AssertionError,程序运行终止

断言的使用主要是测试代码的正确性,可以在一定程度上保证代码质量,而且不会影响运行时性能(在实际使用时,assertion都会被disabled)。当出现AssertionError则说明与某些rep与预期出现偏差 ,和抛出异常类似,同样可以在发生错误时输出错误信息。
例:

assert x>=0;
assert x>=0 : "x" is + x;//:之后的是抛出断言错误的信息

1.2 断言的使用

使用场景

  • 内部不变量。e.g. assert x>0;
  • rep不变量,通过类中定义方法实现。
public class Plane{
	String type;
	String name;
	...
	private void checkRep(){
		assert type!=null;
		assert name!=null;
	}
	public String getname(){
		checkRep();
		return this.name;
	}
	...
}
  • 控制流不变量,主要用在函数无法执行到的位置或switch-case的default中
switch (choice){
	case 'a': return "A";
	case 'e': return "E";
	...
	default: assert false;
} 
  • 方法的前置条件和后置条件

断言使用tips

  • assert在运行时将被屏蔽,不能将执行代码放在assert语句中
  • 不要检查一些无意义的赋值语句
//没有意义的断言
int x = 0;
int y = x + 1;
assert y == x + 1;
  • 断言是用来检查程序内部的Bug,而外部程序是使用Exception机制来处理的
  • 断言处理程序不应该发生的情况;而Exception处理程序可能出现的异常

2 防御式编程

防御性编程的最佳形式首先是不插入错误。之前介绍的Exception处理机制和断言都是防御式编程的一种形式。除此之外还包括无效输入检查、设置路障等方法。

  • 无效输入检查。对于来自外部输入的数据要进行检查,如文件、控制台输入等,主要对输入的格式和数据类型进行检查,比如采用正则表达式来匹配检查等
  • 设置路障。对于类中public方法接收的外部数据,需要通过路障进行处理保证安全之后才能被private方法调用。
  • 调试辅助。采用debug静态代码分析工具进行价差。Java中常用的工具是SpotBugs,开源git仓库:SpotBugs
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值