当我点击计算时,我的程序怎么会冻结?

时间:2015-07-12 08:17:10

标签: java while-loop integer-division

这是我的代码:

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);
}                               

该程序应该计算多少年(count),例如价值2000美元的CD变为5000美元,年利率为8%。这应该返回12.我所做的是创建一个while循环,直到2000美元变成$ 5000或更多的兴趣,由intInitialinvest += (intInitialInvest * dblAnnualPercent);表示

每次我通过点击&#34;计算&#34;来运行程序按钮,程序冻结,什么都不做,然后我必须进入任务管理器关闭它。

2 个答案:

答案 0 :(得分:0)

如果intInitialInvest=0dblAnnualPercent=0intEndingValue > 0您将永远循环。

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

您必须在进入循环之前测试您的值,尤其是当您似乎从某些输入中读取这些值时。这是一种可能的攻击媒介,即使您对这些值进行断言,当您的算法中断时,有人提供的输入会生成intInitialInvest=0intAnnualInterest<100

答案 1 :(得分:0)

小心整数除法

double dblAnnualPercent = intAnnualInterest/100;

导致dblAnnualPercent的值为0.0,因此您会遇到无限循环。您执行整数除法(例如8/100=0然后转换为双倍(0.0,而不是0.05,如您所料。)

double dblAnnualPercent = intAnnualInterest/100.;

应该修复你的错误。

提示:添加断言,在启用断言的情况下运行您的问题

assert(dblAnnualPercent > 0.);

可以保存您(假设您使用-ea运行程序。)

但也尝试在没有循环的情况下解决您的问题。有一个封闭形式的解决方案,使用数学而不是循环...该解决方案仅一行