数据的校验和空指针
Posted skyice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据的校验和空指针相关的知识,希望对你有一定的参考价值。
一、重视数据的校验
为什么要重视校验,因为对于外面传输的数据,程序是并不知道具体值的,一些边界之外的值就可能导致程序异常,一般情况下会注意,但是更多的时候等到程序在测试环境中出现了错误,才会去校验,这种情况属于被动校验,程序员更应该是主动校验数据。
public void login(LoginForm form,HttpServeletRequest request){
//直接处理业务逻辑
userService.login(form);
}
上诉这种情况就要求了调用该接口的必须要传入正确参数,但是对于调用这多且复制时,传入的参数可能就出现空的情况,如果没有检查,那么就报空指针。程序员是不允许上线的程序出现空指针异常,要将空指针异常视为一个严重的问题,而不是简简单单的BUG问题。
public void login(LoginForm form,HttpServeletRequest request){
if(form.getAccount == null || "".equals(form.getAccount))){
//错误处理
return;
}
//直接处理业务逻辑
userService.login(form);
}
上述就避免了后续比较数据出现异常。
上述是一个空指针异常,而插入到数据库中的数据会有一个边界值,如account在数据库中最大长度为20,如果传入的数据超过,那么该条数据插入不到数据库中,直接异常,如果还没有异常处理时,直接返回错误的情况,那么就让人认为水平有问题了。
上述处理有些复杂,那么可以使用框架hibernate validator框架,框架能够满足我们大部分情况
@GET
@SET
public class LoginForm{
@NotBlank(message="账号不能为空")
private String account;
@NotBlank(message="密码不能为空")
private String pwd;
}
public void login(@Valid LoginForm form,HttpServeletRequest request){
//直接处理业务逻辑
userService.login(form);
}
二、不为空判断
在很多情况,我们都会认为有值,但是程序有些情况不是按照自己的来
public void login(LoginForm form ){
User user = userDao.select(form.getAccount());
if(!form.getPwd().equals(user.getPwd())){
//判断密码错误逻辑处理
}
}
上述代码中用户不存在时,就会出现空指针异常。为什么会出现空指针,用户登录的时候,传入正确的账户,数据库中肯定是有值的,但是用户就是传入一个异常的账户,获取到的User就是等于null,出现了空指针异常。即使用户输入正确的账户,但如果有其他业务逻辑删除该账户,或者该账户冻结,而查询是非冻结的账户,那么还是查询为空,后续还是出现异常。
这种就需要判断user是否为空,做为空处理,然后在处理密码是否匹配。
思考在什么情况下为空,上述判断是不为空应该做业务逻辑,还有一些情况是一般情况下一直存在,但是因为特殊原因出现问题,比如从缓存中去数据
String value = redis.get(key);
redis的有一个最大内存,且有一个策略去删除内存满了之后的操作,而刚好,如果该数据已经被删除了,那获取到的值是null,如果是一个对象,拿这个对象去操作,这个时候就可能产生空指针。
缓存存储数据时,特别是过期数据,且更换频繁的情况,就更应该去考虑在什么情况下为空,为什么为空。
在先了空指针判断之后,更应该考虑为什么去判断,在什么情况下才会出现。
三、总结
综上所述就是得出结论:
==传入的参数不可信任,需要对必传参数做校验,错误就提示用户。==
==获取到的数据也不可信任,需要对获取数据做为空判断。==
以上是关于数据的校验和空指针的主要内容,如果未能解决你的问题,请参考以下文章