You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:54:03