为什么当我点击计算时我的程序会死机?
How come my program freezes up when I click calculate?
这是我的代码:
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);
}
这个程序应该计算年利率为 8% 的一张价值 2000 美元的 cd 变成 5000 美元需要多少年(即 count
)。这应该 return 12. 我所做的是创建一个 while 循环,该循环 运行s 直到 2000 美元从利息变成 5000 美元或更多,由 intInitialinvest += (intInitialInvest * dblAnnualPercent);
表示
每次我通过单击 "Calculate" 按钮 运行 程序时,程序会冻结并且不执行任何操作,然后我必须进入任务管理器将其关闭。
如果 intInitialInvest=0
或 dblAnnualPercent=0
和 intEndingValue > 0
你将永远循环。
while (intInitialInvest < intEndingValue){
intInitialInvest += (intInitialInvest * dblAnnualPercent);
count += 1;
}
您必须在进入循环之前测试您的值,尤其是当您似乎从某些输入中读取这些值时。这是一个可能的攻击向量,即使当您断言这些值时,当您的算法中断时,当有人提供输入使得 intInitialInvest=0
或 intAnnualInterest<100
.
小心整数除法:
double dblAnnualPercent = intAnnualInterest/100;
导致 dblAnnualPercent
的值为 0.0
,因此你 运行 进入无限循环。您执行整数除法(例如 8/100=0
),然后 转换为双精度(0.0
,而不是您预期的 0.05
)。
double dblAnnualPercent = intAnnualInterest/100.;
应该修复你的错误。
提示:添加断言,运行启用断言的问题。
assert(dblAnnualPercent > 0.);
本来可以救你的(假设你 运行 你的程序 -ea
)。
但也尝试不用循环解决你的问题。您的问题有一个封闭形式的解决方案,使用数学而不是循环...该解决方案仅 一行 。
这是我的代码:
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);
}
这个程序应该计算年利率为 8% 的一张价值 2000 美元的 cd 变成 5000 美元需要多少年(即 count
)。这应该 return 12. 我所做的是创建一个 while 循环,该循环 运行s 直到 2000 美元从利息变成 5000 美元或更多,由 intInitialinvest += (intInitialInvest * dblAnnualPercent);
每次我通过单击 "Calculate" 按钮 运行 程序时,程序会冻结并且不执行任何操作,然后我必须进入任务管理器将其关闭。
如果 intInitialInvest=0
或 dblAnnualPercent=0
和 intEndingValue > 0
你将永远循环。
while (intInitialInvest < intEndingValue){
intInitialInvest += (intInitialInvest * dblAnnualPercent);
count += 1;
}
您必须在进入循环之前测试您的值,尤其是当您似乎从某些输入中读取这些值时。这是一个可能的攻击向量,即使当您断言这些值时,当您的算法中断时,当有人提供输入使得 intInitialInvest=0
或 intAnnualInterest<100
.
小心整数除法:
double dblAnnualPercent = intAnnualInterest/100;
导致 dblAnnualPercent
的值为 0.0
,因此你 运行 进入无限循环。您执行整数除法(例如 8/100=0
),然后 转换为双精度(0.0
,而不是您预期的 0.05
)。
double dblAnnualPercent = intAnnualInterest/100.;
应该修复你的错误。
提示:添加断言,运行启用断言的问题。
assert(dblAnnualPercent > 0.);
本来可以救你的(假设你 运行 你的程序 -ea
)。
但也尝试不用循环解决你的问题。您的问题有一个封闭形式的解决方案,使用数学而不是循环...该解决方案仅 一行 。