Java ISP计费程序问题:if语句多输出及else报错求助
Java ISP计费程序问题修复
你的代码里存在两个核心问题,根源都是if语句末尾多余的分号:
问题原因分析
- 添加else报错:当你在
if (hours_used <= 10);后面加分号时,这个分号会直接终止if的逻辑(等价于一个空语句),后面的{}变成了独立代码块,和前面的if没有关联。此时再添加else,编译器找不到对应的if,自然报错。 - 两个分支都执行:同样,两个if语句后的分号让条件判断失效,不管
hours_used的值是多少,两个{}里的代码都会无条件执行,所以会同时打印两个账单金额。
修复后的完整代码
import java.util.Scanner; // 修正类名,符合Java驼峰命名规范 public class InternetServiceProvider { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String packageChoice; int hoursUsed = 0; int additionalHours = 0; double additionalCharge = 0; double packageA = 9.95; double packageB = 13.95; double packageC = 19.95; int packATimeLim = 10; int packBTimeLim = 20; double packAAdditionalFee = 2.00; double packBAdditionalFee = 1.00; double totalBill = 0; System.out.println("你使用的是哪个套餐?"); packageChoice = scanner.nextLine(); switch (packageChoice) { case "c": System.out.printf("你的账单金额为:$%.2f/月%n", packageC); break; case "a": System.out.println("你使用了多少小时的网络?"); hoursUsed = scanner.nextInt(); // 去掉if条件后的分号,改用if-else结构确保只执行一个分支 if (hoursUsed <= packATimeLim) { System.out.printf("你的账单金额为:$%.2f/月%n", packageA); } else { additionalHours = hoursUsed - packATimeLim; additionalCharge = additionalHours * packAAdditionalFee; totalBill = packageA + additionalCharge; System.out.printf("你的账单金额为:$%.2f%n", totalBill); } break; // 补充case "b"的逻辑 case "b": System.out.println("你使用了多少小时的网络?"); hoursUsed = scanner.nextInt(); if (hoursUsed <= packBTimeLim) { System.out.printf("你的账单金额为:$%.2f/月%n", packageB); } else { additionalHours = hoursUsed - packBTimeLim; additionalCharge = additionalHours * packBAdditionalFee; totalBill = packageB + additionalCharge; System.out.printf("你的账单金额为:$%.2f%n", totalBill); } break; default: System.out.println("无效的套餐选择"); break; } scanner.close(); } }
额外优化说明
- 修正变量和类名的命名,符合Java驼峰命名规范,提升代码可读性
- 使用
printf格式化输出,确保金额显示两位小数,更贴合账单展示需求 - 补充
case "b"的逻辑和default分支,让程序逻辑更完整 - 最后关闭Scanner资源,避免资源泄漏
运行示例(套餐a、11小时场景):
你使用的是哪个套餐? a 你使用了多少小时的网络? 11 你的账单金额为:$11.95
内容的提问来源于stack exchange,提问作者Abothicon
相关产品推荐
相关产品推荐

