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
相关产品推荐
相关产品推荐

