Java开发:订单模块算术计算与打印语句功能异常求解
故障定位与修复方案
运费、总价始终为0的根因
- 数据类的三个计算方法本身逻辑没有问题,故障出在应用类调用计算方法时传参错误:
- 应用类里声明了一对从未赋值的局部变量
double subtotal = 0, shippingFee = 0,后续流程中从来没有把实际计算得到的金额赋值给这两个变量。 - 所有调用
setShippingFee()、setTotalOrderPrice()的位置,传入的都是这两个永远为0的局部变量,而非从订单对象中读取的实际Subtotal值,导致算出来的运费、总价永远是0。 - 首次生成订单的流程中,根本没有调用
setShippingFee()和setTotalOrderPrice(),初始打印时这两个字段还是数据类的默认初始值0。
- 应用类里声明了一对从未赋值的局部变量
- 优化修复方式:
- 去掉应用类里多余的局部变量
subtotal和shippingFee,所有计算直接使用订单对象内部的成员变量。 - 调整数据类的计算方法,去掉多余的入参,直接使用自身成员变量计算,从根源上避免传错值的问题:
// 优化后的运费计算方法,不需要传参 public void setShippingFee() { this.shippingFee = this.subtotal * 0.1; } // 优化后的总价计算方法,不需要传参 public void setTotalOrderPrice() { this.totalOrderPrice = this.subtotal + this.shippingFee; } - 所有完成Subtotal计算的位置,紧接着调用无参的运费、总价计算方法,确保三个字段都是最新值:
// 比如首次生成订单、修改订单后,计算完Subtotal要紧跟下面两个调用 order1.setSubtotal(itemPrice, quantity); order1.setShippingFee(); order1.setTotalOrderPrice();
- 去掉应用类里多余的局部变量
打印文本错位的根因
- 问题本质是
System.out的行缓冲机制:当printf打印的内容没有遇到换行符时,会暂存在输出缓冲区,不会立刻显示到控制台。 - 你在打印交互提示的字符串末尾没有加换行符,printf把提示内容写入缓冲区后,立刻调用
input.nextInt()阻塞等待用户输入,直到用户输入完回车触发缓冲区刷新,残留的提示文本、后续分支的输出才会一起显示,既造成了输入值出现在提示文本之前的颠倒观感,也会让格式说明符%n被当作普通文本字面输出。 - 修复方式:在交互提示的末尾补充换行符
%n,确保提示内容打印后立刻触发缓冲刷新,先显示提示再等待用户输入:// 把原来的printf字符串末尾加上%n System.out.printf("...Enter 0 for no or 1 for yes.%n", /* 原有参数 */);
汇总信息不输出的根因
- 你写的汇总打印代码,被放在了不会被执行到的代码路径上。常见原因包括:
- 复制第一笔订单的处理逻辑时,误把汇总代码嵌入了某个条件分支内部,而当前运行路径没有触发这个分支。
- 在第二笔订单的更新逻辑末尾,不小心写了
return语句直接退出main方法,后面的汇总代码永远不会被执行。
- 修复方式:把汇总打印的代码移动到所有订单输入、修改、重新计算逻辑的外部,确保两笔订单的所有交互处理完成后,才走到汇总打印的代码行。
内容的提问来源于stack exchange,提问作者alexion
相关产品推荐
相关产品推荐

