【问题标题】: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); 表示

每次我通过单击“计算”按钮运行程序时,程序都会冻结并且不执行任何操作,然后我必须进入任务管理器将其关闭。

【问题讨论】:

    标签: java while-loop integer-division


    【解决方案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 的输入时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多