为什么输入done将布尔值设为true后,Java的while循环仍无法跳出?
问题根因与修复方案
核心错误点
- 字符串比较逻辑错误:Java中
==和!=用于判断对象的内存地址是否相同,不能用来匹配字符串内容,需要调用equals()方法实现内容比较。原代码循环中判断输入是否为done、判断日期是否切换的逻辑都用了错误的比较方式,导致终止条件不触发、日期切换逻辑失效。 - 终止判断位置错误:循环内先输入日期后没有第一时间判断是否为终止标记,会强制要求用户输入工时才能继续执行,即便输入了
done也会先进入输入工时的流程,逻辑顺序错误。 - 工时累加逻辑错误:循环内仅读取了工时的字符串内容,没有将其转换为数值赋值给
hoursWorked变量,导致每次累加的都是第一次输入的工时数值,多段工时统计完全错误。 - 数值类型转换不匹配:原声明
hoursWorked为双精度浮点型,但解析输入时用了Integer.parseInt只支持整数,无法处理带小数的工时输入。
修复后完整代码
import java.util.Scanner; public class SuperMarket { public static void main(String args[]) throws Exception { // 声明变量 final String HEAD1 = "WEEKLY HOURS WORKED"; final String DAY_FOOTER = " Day Total "; // 前导空格为刻意保留格式 final String SENTINEL = "done"; // 终止标记常量 double hoursWorked = 0; // 当前输入的工时 String hoursWorkedString = ""; // 字符串格式的工时输入 String dayOfWeek; // 当前输入的星期 double hoursTotal = 0; // 当日总工时 String prevDay = ""; // 上一次输入的星期 boolean done = false; // 循环控制变量 Scanner input = new Scanner(System.in); // 打印两个空行 System.out.println(); System.out.println(); // 打印标题 System.out.println(HEAD1); // 打印两个空行 System.out.println(); System.out.println(); // 读取第一条记录 System.out.println("Enter day of week or done to quit: "); dayOfWeek = input.nextLine(); if(dayOfWeek.equals(SENTINEL)) done = true; else { System.out.print("Enter hours worked: "); hoursWorkedString = input.nextLine(); hoursWorked = Double.parseDouble(hoursWorkedString); hoursTotal= hoursTotal+hoursWorked; prevDay = dayOfWeek; System.out.println("\t" + DAY_FOOTER + hoursTotal); } while(!done){ System.out.println("Enter day of week or done to quit: "); dayOfWeek = input.nextLine(); // 第一时间判断是否为终止标记 if(dayOfWeek.equals(SENTINEL)){ done = true; break; } // 日期切换时重置当日总工时 if(!prevDay.equals(dayOfWeek)){ hoursTotal =0; } System.out.print("Enter hours worked: "); hoursWorkedString = input.nextLine(); // 解析新输入的工时为数值 hoursWorked = Double.parseDouble(hoursWorkedString); prevDay = dayOfWeek; hoursTotal += hoursWorked; System.out.println("\t" + DAY_FOOTER + hoursTotal); } System.out.println(DAY_FOOTER + "(" + prevDay + ") " + hoursTotal); System.exit(0); } }
验证效果
按照示例输入Friday→4→done,程序会正确输出第一次输入后的当日总工时4,输入done后直接终止循环,最终输出Day Total (Friday) 4,完全符合预期。同时支持同天多次输入工时累加、跨天自动重置工时统计、小数工时输入等场景。
内容的提问来源于stack exchange,提问作者Ryan Waldman
相关产品推荐
相关产品推荐

