zoukankan      html  css  js  c++  java
  • 数据的校验和空指针

    一、重视数据的校验

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

    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. 获取到的数据也不可信任,需要对获取数据做为空判断。

  • 相关阅读:
    make[1]: *** [/workopenwrt/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory `/work/openwrt/trunk' make: *** [world]
    安卓端与开发板通信
    openwrt串口的使用
    .OpenWrt驱动程序Makefile的分析概述 、驱动程序代码参考、以及测试程序代码参考
    openwrt系统之字符设备驱动软件包加载、测试程序加载
    cc2530串口通信流程
    cc2530操作任务系统初始化分析
    总结OpenWrt系统基本操作方法
    Zigbee协议栈OSAL层API函数【转载】
    cc2530启动流程---广播发送数据
  • 原文地址:https://www.cnblogs.com/skyice/p/11665768.html
Copyright © 2011-2022 走看看