首页 > 其他分享 >边界-不可忽视的问题

边界-不可忽视的问题

时间:2023-10-31 20:12:32浏览次数:36  
标签:BankAccount 边界 int 不可 long amount 忽视 balance 边界值

边界,边界,还是边界

在Java程序设计中,边界值处理是一个容易被忽视但极其重要的环节。尤其是当涉及到基本数据类型如int时,边界值的处理不当将会导致潜在的安全隐患和错误。本文将通过一个实际案例,详细分析int边界值不做校验的潜在危害,以及针对这一问题的改进建议。

先来了解一下int数据类型。在Java中,int是一个32位的有符号整数,其取值范围为-2,147,483,648到2,147,483,647。当我们在程序中使用int时,很容易忽视其取值范围,从而导致溢出问题。

现以一个银行转账系统为例,详细说明int边界值不做校验的潜在危害。假设银行转账系统中,用户的账户余额以int类型存储。假设某用户账户余额为2,147,483,600,即将接近int的最大值。当该用户尝试转账100,000到另一个账户时,由于int类型的最大值限制,账户余额将溢出变为负值。如下所示:

public class BankAccount {
    private int balance;

    public BankAccount(int initialBalance) {
        this.balance = initialBalance;
    }

    public void transfer(BankAccount targetAccount, int amount) {
        this.balance = this.balance - amount;
        targetAccount.setBalance(targetAccount.getBalance() + amount);
    }

    // Getter and setter for balance
}

在这个代码示例中,BankAccount类表示一个银行账户,其中balance为int类型。当我们调用transfer方法时,如果转账金额导致balance超过int的最大值,就会出现溢出问题。在这种情况下,用户原本应该拥有的大额资金反而会变为负值,给银行和用户都带来严重损失。

为解决这一问题,我们可以采取以下改进措施:

  1. 使用更大范围的数据类型:可以将int类型替换为long类型,从而扩大可表示的数值范围。long类型是一个64位的有符号整数,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。这将显著降低因为边界值溢出而导致的错误风险。
public class BankAccount {
    private long balance;

    public BankAccount(long initialBalance) {
        this.balance = initialBalance;
    }

    // Other methods remain the same
}
  1. 对边界值进行校验:在执行转账操作前,检查账户余额是否足够完成转账,以及转账后余额是否在合法范围内。如果不满足条件,程序应拒绝执行转账操作并提示用户。
public void transfer(BankAccount targetAccount, long amount) {
    if (this.balance < amount) {
        System.out.println("Insufficient balance.");
        return;
    }

    long newBalance = this.balance - amount;
    long targetNewBalance = targetAccount.getBalance() + amount;
    if (newBalance > Integer.MAX_VALUE || newBalance < Integer.MIN_VALUE || targetNewBalance > Integer.MAX_VALUE || targetNewBalance < Integer.MIN_VALUE) {
        System.out.println("Transfer amount exceeds the limit.");
        return;
    }

    this.balance = newBalance;
    targetAccount.setBalance(targetNewBalance);
}

通过这些改进措施,我们可以降低因边界值溢出导致的程序错误和安全风险,提高系统的稳定性和可靠性。此外,程序员在编写代码时,应时刻关注边界值问题,采用严谨的编程风格,避免潜在的问题。

更多精彩文章,关注公众号 【小白技术圈】

标签:BankAccount,边界,int,不可,long,amount,忽视,balance,边界值
From: https://www.cnblogs.com/camelqz/p/17801212.html

相关文章

  • 提高项目成功率:6种不可忽视的项目估算技巧
    6种准确项目估算的技巧:1.自上而下的估算;2.自下而上的估算;3.三点估算;4.类比估算;5.参数估算;6.基于专业知识的估算。项目估算是对项目从开始到结束所需时间、成本和资源的有根据的预测。当你为家人准备晚餐时,你面前有一小群饥肠辘辘的人在想知道什么时候可以吃饭。你知道你必须......
  • MySQL8.0新特性之:不可见列
    概念描述  从MySQL8.0.23版本开始,MySQL支持不可见列(invisiblecolumns),在之前版本中MySQL对所有列都是可见的,所谓不可见列就是指在正常默认查询中不会显示出来,用select*from语句是无法查询出不可见属性的列的。使用场景  1. 隐藏字段:刻意隐藏不想展示的字段,比如备注,敏感值,关......
  • MySQL8.0新特性之:不可见索引
    概念描述  MySQL从8.0版本开始支持不可见索引(invisibleindex)也可叫隐式索引,隐形索引或者隐藏索引。不可见索引是不被MySQL优化器使用的,但是优化器会正常维护它。使用场景非主键上的索引使用测试删除索引对性能的影响,而无需进行破坏性更改(通常对于大表来说,删除或者重建索引的影响......
  • 黑盒测试应用场景法、等价类划分法、边界值分析法和错误推测法
    在教务系统中进行课程成绩录入,要求0≤成绩≤100,且成绩为数字,整数。(1)请针对成绩输入项,分析等价类。输入条件有效等价类编号无效等价类编号输入成绩0≤成绩≤1001成绩<02成绩>1003成绩为数字,整数。4非整数(小数、中文、英文......
  • harbor登陆提示:核心服务不可用
    1、检查日志,错误明细redis组件应该出问题了tail-f/var/log/harbor/core.logdockerps2、排查redis日志,就重启过一次这个文件权限也不知道为什么就不对了,.查看harbor对应的docker-compose.yaml文件,该目录对应的本地的/data/redistail-f/var/log/harbor/redis.log解......
  • DWS临时内存不可用报错: memory temporarily unavailable
    本文分享自华为云社区《DWS临时内存不可用报错:memorytemporarilyunavailable》,作者:漫天。1、定位报错的DN/CN当出现memorytemporarilyunavailable报错时,首先根据报错信息确认具体是哪个cn/dn报的,如果报错信息没有类似dnxxxx_xxxx这样的信息,就是cn报的,需要去每个cn的日志里......
  • 计算离散点的边界 MATLAB计算多维凸包
    无论是进行回归、拟合还是深度学习,总要将总体数据集划分为训练样本集和测试样本集。然而,一般情况下,测试集位于训练集“所覆盖的范围之内”时(如下图所示,红色星号表示训练样本集所在位置,蓝色圆点表示测试样本集所在位置),测试效果较好,测试结果也更具合理性。但是如何验证测试集是否在......
  • 什么是幻读,脏读,不可重复读?事务的各个隔离级别都是如何实现的?
    一、什么是幻读,脏读,不可重复读?事务A、B交替执行,事务A读取到事务B未提交的数据,这就是脏读。在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并悄悄提交,之后事务A再次查询相......
  • 互联网医院|互联网医院建设三级等保不可缺
    等级保护全称“网络安全等级保护”,指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级响应、处置。 要想申请互联网医院,就......
  • 减少软件故障、防范黑客,软件质量安全问题不容忽视
    软件质量的重要性毋庸置疑,而对于开发人员来说,软件质量更多反应的是代码的质量。虽然有报告显示代码质量安全的行业现状显示出持续改进的态势。2022年全年,奇安信代码安全实验室对2001个国内企业自主开发的软件项目源代码进行了安全缺陷检测,整体缺陷密度为10.11个/千行,高危缺陷密度为......