生成小于首个随机数的第二个随机数遇问题:代码报错或返回空值
解决生成小于第一个随机数的第二个随机数时的报错问题
原问题代码
Random randN = new Random(); int firstNumbereasy; //declaring variables for easy mode int secondNumbereasy; firstNumbereasy = randN.nextInt(11); // secondNumbereasy= randN.nextInt(firstNumbereasy-1);
报错原因
当firstNumbereasy生成0或1时,firstNumbereasy-1会变成-1或0,而Random.nextInt(int bound)要求传入的bound必须大于0,此时会直接抛出IllegalArgumentException,导致代码报错;如果异常未被正确捕获处理,还可能出现返回空值之类的异常情况。
修复方案
方案1:限制第一个随机数的范围(推荐)
如果业务场景允许第一个数从2开始(确保存在更小的非负整数),可以直接调整第一个数的生成逻辑,避免边界问题:
Random randN = new Random(); int firstNumbereasy = randN.nextInt(10) + 2; // 生成2~10的随机数(包含2,不包含12) int secondNumbereasy = randN.nextInt(firstNumbereasy); // 生成0~firstNumbereasy-1的随机数,必然小于第一个数
这里randN.nextInt(firstNumbereasy)会生成[0, firstNumbereasy-1]区间的整数,完全满足"小于第一个随机数"的要求,同时避免了参数非法的问题。
方案2:兼容所有初始范围的边界处理
如果必须保留第一个数0~10的范围,需要针对边界情况做特殊处理:
Random randN = new Random(); int firstNumbereasy = randN.nextInt(11); int secondNumbereasy; if (firstNumbereasy == 0) { // 无小于0的非负整数,根据业务需求处理,比如抛出异常或设置默认值 throw new IllegalArgumentException("无法生成小于0的非负整数"); } else if (firstNumbereasy == 1) { secondNumbereasy = 0; // 唯一小于1的非负整数 } else { secondNumbereasy = randN.nextInt(firstNumbereasy); }
内容的提问来源于stack exchange,提问作者Lau
相关产品推荐
相关产品推荐

