修改Time对象特定字段时意外改变整个对象的问题排查
Time对象增量方法的问题修复
为什么修改this会影响time变量?
Java里对象参数是引用传递,如果调用这个方法时,this和传入的time指向同一个实例,那你修改this.second、this.minute这些字段,本质上就是在修改这个共享实例的成员变量,自然会同步反映到time引用的对象上——俩变量指向的是同一个内存地址。
代码逻辑的核心错误(导致负数/全0问题)
你的进位处理和秒数拆分逻辑完全走偏了:
- 秒数拆分不该用Math.abs:如果传入的
seconds是负数(要减时间),你直接取绝对值就把负号丢了,导致本该减的变成加,后续逻辑全错。 - 进位处理完全覆盖了原有值:比如你先算
this.minute = time.minute + sum.minute,但下一行直接把this.minute改成(int)(this.second / 60),等于把之前的累加值全丢了,这就是最后变成00:00的原因。正确的做法是把秒的进位加到分钟上,再处理分钟到小时的进位,而不是直接覆盖。
修复后的代码
public void incrementJaret(Time time, double seconds) { // 先把总秒数转成整数,避免double精度问题 long totalSeconds = Math.round(seconds); // 拆分出要加的时、分、秒,保留符号 int addSeconds = (int)(totalSeconds % 60); long totalMinutes = totalSeconds / 60; int addMinutes = (int)(totalMinutes % 60); long totalHours = totalMinutes / 60; int addHours = (int)(totalHours % 24); // 若需处理天数,可在此继续扩展逻辑 // 先计算原始值+增量,暂不处理进位 int newSecond = time.second + addSeconds; int newMinute = time.minute + addMinutes; int newHour = time.hour + addHours; // 处理秒进位到分钟,兼容负数场景 newMinute += newSecond / 60; newSecond = newSecond % 60; if (newSecond < 0) { newSecond += 60; newMinute -= 1; } // 处理分钟进位到小时,兼容负数场景 newHour += newMinute / 60; newMinute = newMinute % 60; if (newMinute < 0) { newMinute += 60; newHour -= 1; } // 处理小时的24进制循环,兼容负数场景 newHour = newHour % 24; if (newHour < 0) { newHour += 24; } // 统一赋值给当前对象 this.second = newSecond; this.minute = newMinute; this.hour = newHour; }
额外优化点
- 用
long处理总秒数,避免double的精度丢失问题(比如0.1秒累加多次会出现误差) - 分开计算新值再统一赋值,避免中间修改导致的逻辑混乱
- 单独处理负数的进位场景,确保减时间的逻辑正确
内容的提问来源于stack exchange,提问作者Jaret Sanchez
相关产品推荐
相关产品推荐

