仓库清单中的每个对象都包含最终库存,安全库存和所需库存。 我的目标是改变一个物体的最终库存,如果小于安全库存的10%,并将其放在安全库存的%10到%5的范围内。要使用随机化器代码执行此操作:
Random random=new Random();
for(Warehouse obj:warehouseList){
double diff=obj.getEndStock()-obj.getSafetyStock();
if(((diff/obj.getSafetyStock())*100)<(-5)){
diff=Math.abs(diff)+(1.05*obj.getSafetyStock())-obj.getSafetyStock();
if(diff<0)
Logging.log(diff,"\n");
int randomNum=0;
double reqStock=0;
double end=obj.getEndStock();
while(((end-obj.getSafetyStock())*100)<(-5)){
randomNum=random.nextInt((int)diff);
reqStock+=randomNum;
end+=randomNum;
}
obj.setRequiredStock(reqStock);
obj.setEndStock(end);
}
}
}
现在问题:我正在检查diff变量是否变为负数,因为它没有在控制台上打印,但是每当我到达行 randomNum = random.nextInt((int)diff) ; 该程序抛出以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
at java.util.Random.nextInt(Unknown Source)
at managing.Final.randomWay(Final.java:163)
at managing.Final.main(Final.java:252)
任何人都可以帮忙吗?
答案 0 :(得分:3)
这很简单。看看这两行:
double diff=obj.getEndStock()-obj.getSafetyStock();
...
randomNum=random.nextInt((int)diff);
您的diff
包含最终库存和安全库存之间的差异。如果最终库存低于安全库存,则diff
将包含负数。
nextInt
方法需要一个正整数作为参数。如果您的diff
为否定,则会收到此错误。
编辑:为了回应评论,我再次仔细阅读了这个问题并注意到了我错过的一行。有了这条线:
diff=Math.abs(diff)+(1.05*obj.getSafetyStock())-obj.getSafetyStock();
你实际上可以获得0
。 (我假设你的getSafetyStock
总会返回一个正数 - 如果没有,那么这可能是你的问题。)
在您的代码中,您正在检查diff
是否为0
- 但除了打印日志行之外没有做任何事情。
总的来说,在将diff
用作nextInt
的参数之前,打印{{1}}的值可能是有意义的,无论它是什么用于调试目的。
答案 1 :(得分:0)
我看不到负值的检查。这里:
if(diff==0)
Logging.log(diff,"\n");
你检查零等式,这对于双类型变量来说是奇怪的。
答案 2 :(得分:0)
我觉得我错了。 nextInt方法要求它的参数为正,但如果非负,则检查。这就是导致错误的原因。
此代码证明了我的观点:
import java.util.Random;
public class RandomMain {
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt(0));
}
}
它会产生异常:
Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
at java.util.Random.nextInt(Random.java:300)
at RandomMain.main(RandomMain.java:6)