java中int边界值_Java 边界陷阱(边界值的校验)

一、案列

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

import java.util.Scanner;
 
public class Demo {
    // 一个会员拥有产品的最多数量
    public final static int LIMIT = 2000;
 
    public static void main(String[] args) {
        // 会员当前用有的产品数量
        int cur = 1000;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入需要预定的数量:");
        while (input.hasNextInt()) {
            int order = input.nextInt();
            if (order > 0 && order + cur <= LIMIT) {
                System.out.println("你已经成功预定:" + order + " 个产品");
            } else {
                System.out.println("超过限额,预定失败!");
            }
        }
 
    }
}

以上是一个简单的订单处理程序demo示例,来看一下代码运行结果:

4ba868db19622d3b99fcc54e9646b385.png

结果看上去是没有问题,代码也很简单,看一眼就知道是什么意思,来我们接着再试一次:

30ee907b2323da43d6e208acdb0f2a7e.png

竟然成功了,不可思议,输入的数字2147483647已经远超出用户限额2000,但是为什么会成功呢?仔细看 order + cur <= LIMIT 这里的数据类型是int,而示例输入的数字2147483647正好是int类型的边界值(max),2147483647 + 1000 = -2147482649,小于限定条件LIMIT,所以导致错误的发生。

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

二、解决边界问题

对加减后的值进行条件判断;

public static void main(String[] args) {
        // 会员当前用有的产品数量
        int cur = 1000;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入需要预定的数量:");
        while (input.hasNextInt()) {
            int order = input.nextInt();
            // 对加减后的值进行条件判断,考虑边界问题
            int totalNum = order + cur;
            System.out.println(totalNum);
            if (order > 0 && totalNum > 0 && totalNum <= LIMIT) {
                System.out.println("你已经成功预定:" + order + " 个产品");
            } else {
                System.out.println("超过限额,预定失败!");
            }
        }
    }

运行结果:

a05b1ebad199de45e3476b95dcf01b63.png

三、复习Java基本数据类型

  • 既然说到基本数据类型,就来顺便回顾一下Java中的4类8种基本数据类型:

1d506f5857e4d5d00012c0fdc7de940f.png

代码示例:

public class Test {
	static byte b;
    static short s;
    static int i;
    static long l;
    static float f;
    static double d;
    static char c;
    static boolean bo;
	public static void main(String[] args) {
			System.out.println("byte的大小   : " + Byte.SIZE+   ";    默认值:" + b + ";        数据范围:" + Byte.MIN_VALUE + " - " + Byte.MAX_VALUE);
			
			System.out.println("short的大小  :" + Short.SIZE + ";    默认值:" + s + ";        数据范围:" + Short.MIN_VALUE + " - " + Short.MAX_VALUE);
			
			System.out.println("int的大小    :" + Integer.SIZE + ";    默认值:" + i + ";        数据范围:" + Integer.MIN_VALUE + " - " + Integer.MAX_VALUE);
			
			System.out.println("long的大小   :" + Long.SIZE + ";    默认值:" + l + ";        数据范围:" + Long.MIN_VALUE + " - " + Long.MAX_VALUE);
			
			System.out.println("float的大小  :" + Float.SIZE + ";    默认值:" + f + ";      数据范围:" + Float.MIN_VALUE + " - " + Float.MAX_VALUE);
			
			System.out.println("double的大小 :" + Double.SIZE + ";    默认值:" + d + ";      数据范围:" + Double.MIN_VALUE + " - " + Double.MAX_VALUE);
			
			System.out.println("char的大小   :" + Character.SIZE + ";    默认值:" + c + ";        数据范围:" + Character.MIN_VALUE + " - " + Character.MAX_VALUE);
			
			System.out.println("boolean的大小:" + "  ;    默认值:" + bo + ";    数据范围: " + "  - ");
	 }
}

运行结果:

8f70947d2833a4b4ffdfe67509930694.png

运行结果中的char的数据范围貌似有点问题,不应该是0 - 65535吗?看图:

f702775c4709f8f9ec07097c182e5b8c.png

Java中的char类型由两个字节即十六位来表示,因为是无符号数,所以为2的16次方,数值范围就为:0 - 2^16-1;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 邮箱用户名边界程序源码(C语言)如下: ```c #include <stdio.h> int validateEmail(char *username) { int length = 0; // 获取字符串长度 while (*username != '\0') { length++; username++; } // 检查长度是否符合边界(6~18个字符) if (length < 6 || length > 18) { return 0; // 不符合边界,返回0 } // 检查字符是否符合要求(只能包含字母、数字、下划线) while (*username != '\0') { if ((*username >= 'A' && *username <= 'Z') || (*username >= 'a' && *username <= 'z') || (*username >= '0' && *username <= '9') || (*username == '_')) { username++; } else { return 0; // 包含非法字符,返回0 } } return 1; // 符合边界和要求,返回1 } int main() { char username[30]; // 从用户输入获取邮箱用户名 printf("请输入邮箱用户名:"); scanf("%s", username); // 验证用户名 int isValid = validateEmail(username); // 输出验证结果 if (isValid) { printf("邮箱用户名验证通过。\n"); } else { printf("邮箱用户名不符合边界和要求。\n"); } return 0; } ``` 这段程序使用了`validateEmail`函数来验证邮箱用户名是否符合边界和要求,返回1表示验证通过,返回0表示不符合边界和要求。在`main`函数,我们从用户输入获取邮箱用户名,并调用`validateEmail`函数进行验证,最后输出验证结果。 程序首先获取邮箱用户名的长度,然后检查长度是否在边界(6~18个字符)范围内,如果不在此范围内则返回0。接下来,程序会逐个检查用户名的字符,如果包含字母、数字、下划线以外的字符,则返回0。如果最终通过字符检查,表示符合边界和要求,返回1。 注意,这段代码只是一个简单的示例,实际应用可能需要考虑更多的边界情况和要求。 ### 回答2: 邮箱用户名边界是指在命名邮箱用户名时所遵循的规则和限制。一般来说,邮箱用户名的边界通常包括字符长度和允许使用的字符范围。 以下是一个简单的用C语言编写的邮箱用户名边界程序源码: ```c #include <stdio.h> #include <string.h> int isValidUsername(char username[]) { int len = strlen(username); // 检查长度是否超过最大限制 if (len > 64) { return 0; } // 检查字符是否在允许范围之内 for (int i = 0; i < len; i++) { if (!((username[i] >= 'a' && username[i] <= 'z') || (username[i] >= 'A' && username[i] <= 'Z') || (username[i] >= '0' && username[i] <= '9') || username[i] == '.' || username[i] == '-' || username[i] == '_')) { return 0; } } return 1; } int main() { char username[65]; printf("请输入邮箱用户名:"); scanf("%s", username); if (isValidUsername(username)) { printf("该邮箱用户名符合边界要求。\n"); } else { printf("该邮箱用户名不符合边界要求。\n"); } return 0; } ``` 此程序接受用户输入的邮箱用户名,然后通过`isValidUsername`函数来检查该用户名是否符合边界要求。函数首先检查用户名的长度是否超过最大限制(64个字符),然后依次检查每个字符是否在允许的范围内(小写字母、大写字母、数字、点、减号和下划线)。如果用户名符合要求,程序将输出“该邮箱用户名符合边界要求”,否则输出“该邮箱用户名不符合边界要求”。 ### 回答3: 邮箱用户名的边界是指在程序输入的邮箱用户名的长度限制。一般来说,邮箱用户名的长度限制为6到20个字符之间。 下面是一段使用C语言编写的邮箱用户名边界程序源码: ```c #include <stdio.h> #include <string.h> int main() { char username[21]; // 邮箱用户名的最大长度为20个字符,多1位用于存储字符串结束符'\0' int length; printf("请输入邮箱用户名(长度在6到20之间):\n"); scanf("%s", username); length = strlen(username); if (length < 6 || length > 20) { printf("用户名长度不符合要求\n"); } else { printf("用户名符合要求\n"); } return 0; } ``` 在以上的程序,首先定义了一个长度为21的字符数组`username`用于存储用户输入的邮箱用户名。然后通过`scanf`函数接收用户的输入并存储到`username`变量。 接下来,使用`strlen`函数获取`username`的长度,并将其保存在`length`变量。 最后,通过条件判断语句判断`length`的是否在6到20之间,如果长度不符合要求,则输出"用户名长度不符合要求",否则输出"用户名符合要求"。 需要注意的是,以上的程序还没有对用户名是否符合邮箱用户名的规则进行校验,仅仅是对长度进行了边界的判断。在实际应用,还需要结合正则表达式等方法对用户名是否符合邮箱用户名的规则进行进一步验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值