if-else-if分支逻辑异常导致DP计算出现负数结果求助
问题排查:选择tipe-45/tipe-54时DP计算结果为负数
我开发了一款程序,当选择区域(rb1/rb2/rb3)与户型类型(t1/t2/t3)后,系统会自动生成DP(首付款)。但选择tipe-45和tipe-54类型时,计算结果显示为负数,以下是相关代码片段:
if(rb1.isSelected() && t1.isSelected()){ hargabangunan.setText("90000000"); luas_tanah_asli.setText("60");} else if(rb1.isSelected() && t2.isSelected()){ hargabangunan.setText("120000000"); luas_tanah_asli.setText("90");} else if(rb1.isSelected() && t3.isSelected()){ hargabangunan.setText("150000000"); luas_tanah_asli.setText("110");} else if(rb2.isSelected() && t1.isSelected()){ hargabangunan.setText("100000000"); luas_tanah_asli.setText("70");} else if(rb2.isSelected() && t2.isSelected()){ hargabangunan.setText("130000000"); luas_tanah_asli.setText("110");} else if(rb2.isSelected() && t3.isSelected()){ hargabangunan.setText("170000000"); luas_tanah_asli.setText("120");} else if(rb3.isSelected() && t1.isSelected()){ hargabangunan.setText("120000000"); luas_tanah_asli.setText("80");} else if(rb3.isSelected() && t2.isSelected()){ hargabangunan.setText("140000000"); luas_tanah_asli.setText("120");} else if(rb3.isSelected() && t3.isSelected()){ hargabangunan.setText("200000000"); luas_tanah_asli.setText("140");} int htl = hargat*75/100; tst.setText(Integer.toString(htl)); int lta = Integer.parseInt(luas_tanah_asli.getText()); int ltth = ltt - lta; tsa.setText(Integer.toString(ltth)); int hga = Integer.parseInt(hargabangunan.getText()); int hgaa = hga+lta*hargat+ltth*htl; harga.setText(Integer.toString(hgaa)); String hharga; hharga = harga.getText(); int tharga = Integer.parseInt(hharga); int dp = tharga*20/100; dpf.setText(Integer.toString(dp));
问题原因
- 缺失tipe-45/tipe-54的处理分支:现有代码仅覆盖
t1/t2/t3三种户型与区域的组合,当选择tipe-45或tipe-54时,所有if-else分支都不触发,hargabangunan和luas_tanah_asli保持初始值(可能为空、0或非法值),后续解析和计算会出现异常。 - 整数溢出风险:Java的
int类型最大值为2147483647,现有部分户型的房屋价格已接近2亿,加上土地价格后总金额很容易超出int上限,导致数值溢出变为负数,最终DP计算结果也为负。
修复方案
- 补充tipe-45/tipe-54的逻辑分支:添加对应的
else if语句,为这两种户型设置合法的hargabangunan和luas_tanah_asli值,示例:else if(rb1.isSelected() && tipe45.isSelected()){ hargabangunan.setText("XXXXX"); luas_tanah_asli.setText("YY"); } - 添加默认分支兜底:在所有
if-else末尾添加else分支,设置默认数值或提示用户选择有效户型,避免未赋值情况。 - 替换为
long类型避免溢出:将所有金额相关的int变量改为long,防止数值超出范围,修改后的核心计算代码示例:long htl = (long)hargat * 75 / 100; tst.setText(Long.toString(htl)); int lta = Integer.parseInt(luas_tanah_asli.getText()); long ltth = ltt - lta; tsa.setText(Long.toString(ltth)); long hga = Long.parseLong(hargabangunan.getText()); long hgaa = hga + (long)lta * hargat + ltth * htl; harga.setText(Long.toString(hgaa)); long tharga = Long.parseLong(harga.getText()); long dp = tharga * 20 / 100; dpf.setText(Long.toString(dp)); - 添加合法性校验:在解析文本为数值前,检查
luas_tanah_asli和hargabangunan的文本是否为空或非数字,避免运行时异常。
内容的提问来源于stack exchange,提问作者HERI
相关产品推荐
相关产品推荐

