为啥我点击计算时我的程序冻结了?
Posted
技术标签:
【中文标题】为啥我点击计算时我的程序冻结了?【英文标题】:How come my program freezes up when I click calculate?为什么我点击计算时我的程序冻结了? 【发布时间】:2015-07-12 08:17:10 【问题描述】:这是我的代码:
private void btnCalculateActionPerformed(java.awt.event.ActionEvent evt)
int intInitialInvest = Integer.parseInt(this.txtInputInitialInvest.getText());
int intAnnualInterest = Integer.parseInt(this.txtInputAnnualInterest.getText());
int intEndingValue = Integer.parseInt(this.txtInputEndingValue.getText());
double dblAnnualPercent = intAnnualInterest/100;
int count = 0;
while (intInitialInvest < intEndingValue)
intInitialInvest += (intInitialInvest * dblAnnualPercent);
count += 1;
this.lblOutputYears.setText("The number of years required is " + count);
该程序应该计算例如价值 2000 美元的 cd 在年利率为 8% 的情况下变为 5000 美元需要多少年(即count
)。然后这应该返回 12。我所做的是创建一个 while 循环,该循环一直运行到 2000 美元变成 5000 美元或更多,这由intInitialinvest += (intInitialInvest * dblAnnualPercent);
表示
每次我通过单击“计算”按钮运行程序时,程序都会冻结并且不执行任何操作,然后我必须进入任务管理器将其关闭。
【问题讨论】:
【参考方案1】:小心整数除法:
double dblAnnualPercent = intAnnualInterest/100;
导致dblAnnualPercent
的值为0.0
,因此您会陷入无限循环。您执行整数除法(例如8/100=0
)然后转换为双精度(0.0
,而不是您所期望的0.05
)。
double dblAnnualPercent = intAnnualInterest/100.;
应该修复你的错误。
提示:添加断言,在启用断言的情况下运行您的问题。
assert(dblAnnualPercent > 0.);
会救你的(假设你用-ea
运行你的程序)。
但也尝试在没有循环的情况下解决您的问题。您的问题有一个封闭形式的解决方案,使用数学而不是循环......该解决方案只有一行。
【讨论】:
哦,是的,这就是问题所在!你能告诉我100之后的时期具体做什么吗?抱歉我刚开始学java! 它是一个浮点数而不是整数。阅读整数除法。另外,请接受答案。【参考方案2】:如果 intInitialInvest=0
或 dblAnnualPercent=0
和 intEndingValue > 0
你将永远循环。
while (intInitialInvest < intEndingValue)
intInitialInvest += (intInitialInvest * dblAnnualPercent);
count += 1;
您必须在进入循环之前测试您的值,尤其是当您似乎从某些输入中读取这些值时。这是一个可能的攻击向量,即使你断言这些值,当你的算法中断时,当有人提供intInitialInvest=0
或intAnnualInterest<100
的输入时。
【讨论】:
以上是关于为啥我点击计算时我的程序冻结了?的主要内容,如果未能解决你的问题,请参考以下文章
在 Flutter 中使用 Hive 数据库时我的应用程序冻结