zoukankan      html  css  js  c++  java
  • [改善Java代码]边界,边界,还是边界

    建议24:边界,边界,还是边界

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

    模拟一下输入:

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

    这个数字远超了2000的限额,但是竟然预定成功了.这个2147483647是不是很眼熟?没错,这是int类型的最大值,因为这个值再加上1000的时候超出了int类型的范围,所以结果反而变成了负的。一句话归结其原因:数字越界使校验条件失效。 

    所以在单元测试中,有一项测试叫做边界测试(也有叫做临界测试),如果一个方法接受的是int类型,那么以下三个值是必测的:0、正最大、负最小。如果这三个值都没问题,这个方法才是比较安全可靠的。

    其中正最大和负最小是边界值,如果这三个值没有问题,方法才是安全可靠的.我们的例子就是因为缺少边界测试,导致生产系统产生了严重的偏差.

    就算你再Web界面做出了严格严谨的校验,但其实也只能防普通用户(这里普通用户指不懂HTML、不懂HTTP、不懂Java的简单使用者),而对于高手,这些校验基本上就是摆设,通过对数据进行拦截分析,再写个模拟器进行发送,一切的前段校验就都变成了浮云!!

    所以,必要的数据验证要放在服务端进行

  • 相关阅读:
    11g 配置 dgmgrl 以及报错 DataGuard ORA-00313,
    java三种匿名的方式开启线程
    java 四种方式实现字符流文件的拷贝对比
    java中过滤查询文件
    通过Java实现斗地主
    java中Map的entrySet 和keySet的使用
    python3列表推导式和生成器。
    python的特殊方法总结
    python3 定义向量运算
    python3模拟扑克牌
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5424950.html
Copyright © 2011-2022 走看看