zoukankan      html  css  js  c++  java
  • 基本数据类型的范围边界

        某商家生产的电子产品非常畅销,需要提前30天预订才能抢到手,同时它还规定了一个会员可拥有的最多产品数量,目的是防止囤积压货肆意加价。会员的预定过程是这样的:先登录官方网站,选择产品型号,然后设置需要预订的数量,提交,符合规则即提示下单成功,不符合规则提示下单失败。后台的处理逻辑模拟如下:

    1. public class Client {  
    2.      //一个会员拥有产品的最多数量  
    3.      public final static int LIMIT = 2000;  
    4.      public static void main(String[] args) {  
    5.           //会员当前拥有的产品数量  
    6.           int cur = 1000;  
    7.           Scanner input = new Scanner(System.in);  
    8.           System.out.print("请输入需要预定的数量:");  
    9.           while(input.hasNextInt()){  
    10.             int order = input.nextInt();  
    11.             //当前拥有的与准备订购的产品数量之和  
    12.             if(order>0 && order+cur<=LIMIT){  
    13.                 System.out.println("你已经成功预定的"+order+"个产品!");  
    14.             }else{  
    15.                 System.out.println("超过限额,预订失败!");  
    16.             }  
    17.         }  
    18.     }  

    这是一个简易的订单处理程序,其中cur代表的是会员已经拥有的产品数量,LIMIT是一个会员最多拥有的产品数量(现实中这两个参数当然是从数据库中获得的,不过这里是一个模拟程序),如果当前预订数量与拥有数量之和超过了最大数量,则预订失败,否则下单成功。业务逻辑很简单,同时在Web界面上对订单数量做了严格的校验,比如不能是负值、不能超过最大数量等,但是人算不如天算,运行不到两小时数据库中就出现了异常数据:某会员拥有产品的数量与预订数量之和远远大于限额。怎么会这样?程序逻辑上不可能有问题呀,这是如何产生的呢?我们来模拟一下,第一次输入:

    1. 请输入需要预定的数量:800  
    2. 你已经成功预定的800个产品! 

    这完全满足条件,没有任何问题,继续输入:

    1. 请输入需要预定的数量:2147483647  
    2. 你已经成功预定的2147483647个产品! 

    看到没,这个数字远远超过了2000的限额,但是竟然预订成功了,真是神奇!

    看着2147483647这个数字很眼熟?那就对了,它是int类型的最大值,没错,有人输入了一个最大值,使校验条件失效了,Why?我们来看程序,order的值是2147483647,那再加上1000就超出int的范围了,其结果是-2147482649,那当然是小于正数2000了!一句话可归结其原因:数字越界使检验条件失效。

    在单元测试中,有一项测试叫做边界测试(也有叫做临界测试),如果一个方法接收的是int类型的参数,那以下三个值是必测的:0、正最大、负最小,其中正最大和负最小是边界值,如果这三个值都没有问题,方法才是比较安全可靠的。我们的例子就是因为缺少边界测试,致使生产系统产生了严重的偏差。

  • 相关阅读:
    Web项目java.lang.OutOfMemoryError: PermGen space异常解决
    上传预览,图片展示大小的控制
    Eclipse常用插件安装_PropertiesEditor
    JDK的安装配置
    Eclipse与Tomcat的集成(无插件)
    Jsp&Servlet实现读取本地图片并展示
    DB2日期及时间的使用
    图片的另一种展现—将后台图片编码直接展现为图片
    Eclipse Task的使用
    Eclipse引入BASE64Encoder的问题
  • 原文地址:https://www.cnblogs.com/pbq-dream/p/5288245.html
Copyright © 2011-2022 走看看