为啥我点击计算时我的程序冻结了?

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=0dblAnnualPercent=0intEndingValue &gt; 0 你将永远循环。

while (intInitialInvest < intEndingValue)
    intInitialInvest += (intInitialInvest * dblAnnualPercent);
    count += 1;

您必须在进入循环之前测试您的值,尤其是当您似乎从某些输入中读取这些值时。这是一个可能的攻击向量,即使你断言这些值,当你的算法中断时,当有人提供intInitialInvest=0intAnnualInterest&lt;100 的输入时。

【讨论】:

以上是关于为啥我点击计算时我的程序冻结了?的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Hive 数据库时我的应用程序冻结

为啥我的冻结应用程序被检测为可能的病毒?

为啥 STDIN 会导致我的 Perl 程序冻结?

为啥当我推送我的应用程序时我的 cli 会出错? [复制]

为啥即使我使用 Alamofire 发出请求,我的应用程序仍然冻结?

QPrinter 单击按钮时我的程序崩溃为啥?