数据的校验和空指针

一、重视数据的校验

为什么要重视校验,因为对于外面传输的数据,程序是并不知道具体值的,一些边界之外的值就可能导致程序异常,一般情况下会注意,但是更多的时候等到程序在测试环境中出现了错误,才会去校验,这种情况属于被动校验,程序员更应该是主动校验数据。

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,如果是一个对象,拿这个对象去操作,这个时候就可能产生空指针。

缓存存储数据时,特别是过期数据,且更换频繁的情况,就更应该去考虑在什么情况下为空,为什么为空。

在先了空指针判断之后,更应该考虑为什么去判断,在什么情况下才会出现。

三、总结

综上所述就是得出结论:

  1. 传入的参数不可信任,需要对必传参数做校验,错误就提示用户。

  2. 获取到的数据也不可信任,需要对获取数据做为空判断。

posted @ 2019-10-13 11:35  冰魄秋雨  阅读(494)  评论(0编辑  收藏  举报