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

Java可扩展FizzBuzz程序输出"Fizz"异常的问题排查请求

解决你的FizzBuzz异常问题

嘿,我看看你遇到的FizzBuzz问题——输出出现Fizz4这类异常,核心是代码的分支逻辑没处理好,导致同一个数字的循环里多次修改并打印output变量,咱们一步步来梳理和解决:

原代码的问题点

  • 多次打印同一个数字的结果:比如当i是3的倍数时,第一个if块会先打印Fizz,然后进入第二个if-else分支,因为i不是5的倍数,会执行else块,把i拼到当前的output(此时已经是Fizz了),再打印一次,导致同一个数字输出两次,第二次就变成了Fizz+数字的错误结果。
  • 分支逻辑覆盖不全:如果i同时是3和5的倍数(比如15),原代码会先打印Fizz,再打印FizzBuzz,这不符合FizzBuzz只输出一次FizzBuzz的要求。

修复后的基础版本

我们调整逻辑:先为每个数字生成完整的输出字符串,最后只打印一次,避免多次修改和打印的问题:

public void Buzz(int limit) {
    for (int i = 1; i < limit; i++) {
        String output = ""; // 把output放在循环内部,避免外部变量残留影响
        if (i % 3 == 0) {
            output += "Fizz";
        }
        if (i % 5 == 0) {
            output += "Buzz";
        }
        // 如果output为空,说明既不是3也不是5的倍数,直接用数字填充
        if (output.isEmpty()) {
            output += i;
        }
        System.out.println(output);
    }
}

满足扩展需求的版本(适配不同数值/新增规则)

既然你想要易于编辑、方便扩展规则的版本,咱们可以把规则抽成独立的结构,以后新增规则只需要往列表里加就行,不用修改循环逻辑:

import java.util.ArrayList;
import java.util.List;

// 定义规则类,存储除数和对应的输出文本
class FizzBuzzRule {
    int divisor;
    String label;

    FizzBuzzRule(int divisor, String label) {
        this.divisor = divisor;
        this.label = label;
    }
}

public class ExtensibleFizzBuzz {
    public void run(int limit) {
        // 这里可以轻松添加新规则,比如新增7对应"Bazz",只需要加一行即可
        List<FizzBuzzRule> rules = new ArrayList<>();
        rules.add(new FizzBuzzRule(3, "Fizz"));
        rules.add(new FizzBuzzRule(5, "Buzz"));
        // rules.add(new FizzBuzzRule(7, "Bazz")); // 新增规则示例

        for (int i = 1; i < limit; i++) {
            String output = "";
            // 遍历所有规则,拼接符合条件的文本
            for (FizzBuzzRule rule : rules) {
                if (i % rule.divisor == 0) {
                    output += rule.label;
                }
            }
            // 没有匹配任何规则时,输出数字本身
            if (output.isEmpty()) {
                output += i;
            }
            System.out.println(output);
        }
    }

    // 测试用例
    public static void main(String[] args) {
        new ExtensibleFizzBuzz().run(16);
    }
}

这样以后要加新的规则,比如7对应"Bazz",只需要在rules列表里添加一行rules.add(new FizzBuzzRule(7, "Bazz")),完全不用改动循环里的核心逻辑,非常灵活。

内容的提问来源于stack exchange,提问作者Forehead555

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:20:15