0

0

如何在 Java 的 do-while 循环中正确重置 for 循环变量

霞舞

霞舞

发布时间:2026-02-25 10:49:02

|

550人浏览过

|

来源于php中文网

原创

如何在 Java 的 do-while 循环中正确重置 for 循环变量

本文详解为何 for 循环在重复执行时未从 1 开始,指出根本原因是变量作用域和初始化位置不当,并提供符合 java 最佳实践的重构方案:将循环控制变量(如 i、b)声明在 for 或 do-while 内部,确保每次迭代都获得干净初始状态。

本文详解为何 for 循环在重复执行时未从 1 开始,指出根本原因是变量作用域和初始化位置不当,并提供符合 java 最佳实践的重构方案:将循环控制变量(如 i、b)声明在 for 或 do-while 内部,确保每次迭代都获得干净初始状态。

在您提供的代码中,for 循环未能“重置”并非语法错误,而是典型的变量生命周期管理问题。关键在于:i 和 b 被声明在 switch 外部(即方法级作用域),导致第二次进入 do-while 循环时,b 仍保留上一轮结束时的阶乘结果(如 num=3 后 b=6),而 i 虽在 for 中自增,但因 for 每次都会重新执行初始化语句 i = 1,真正出问题的是 b —— 它未被重置,从而造成后续计算严重错误(例如第二次输入 num=4 时,会从 b=6 开始累乘:6×1=6, 6×2=12, 12×3=36, 36×4=144,而非正确的 1, 2, 6, 24)。

✅ 正确做法:限制变量作用域,就近初始化

Java 最佳实践强调 “最小作用域原则”:变量应在首次使用前、且仅在需要它的代码块内声明。这样既能避免状态残留,又能提升可读性与可维护性。

以下是优化后的完整实现:

超级简历WonderCV
超级简历WonderCV

免费求职简历模版下载制作,应届生职场人必备简历制作神器

下载
import java.util.Scanner;

public class FactorialRunner {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        do {
            System.out.println("The starting number is 1.");
            System.out.print("Enter a value: ");
            int num = sc.nextInt();

            // ✅ 关键修复:i 和 b 均在 for 语句中声明并初始化
            // 每次 for 循环开始时,i=1 且 b=1 —— 绝对干净的起点
            for (int i = 1, b = 1; i <= num; i++) {
                b = b * i;
                System.out.printf("%d! = %d\n", i, b);
            }

            System.out.print("Run the program again? (Y for Yes, N for No): ");
            String input = sc.next();

            if (input.equalsIgnoreCase("N")) {
                System.out.println("Have a great day!");
                sc.close(); // ✅ 及时释放资源
                return; // ✅ 推荐用 return 替代 exit(0),更优雅
            }
            // 若输入为 "Y",循环继续;无需显式 break 或条件判断
        } while (true); // 无限循环 + 显式退出逻辑,结构更清晰
    }
}

⚠️ 注意事项与进阶建议

  • 不要滥用 System.exit(0):在小型示例中虽可行,但在大型应用或测试环境中会强制终止 JVM,影响模块化设计。推荐用 return 退出 main 方法。
  • sc.close() 不可省略:防止资源泄漏,尤其在循环中反复使用 Scanner 时更需注意。
  • switch 在此场景中冗余:原代码中 switch (choice) 仅处理 case 1,且无其他分支逻辑,直接移除可大幅简化结构,降低理解成本。
  • 扩展性思考:若未来需支持多种计算模式(如幂运算、斐波那契),再引入 switch 并为每个 case 设计独立作用域内的变量,而非共享外部变量。

通过将 i 和 b 纳入 for 循环头声明(for (int i = 1, b = 1; ...)),我们从根本上消除了状态污染风险——每一次循环都是全新开始。这不仅是解决当前问题的关键,更是写出健壮、可预测 Java 代码的核心习惯。

立即学习Java免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

562

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

435

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.25

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

177

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

13

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

41

2025.12.06

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

584

2024.08.29

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

13

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.1万人学习

Java 教程
Java 教程

共578课时 | 71.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号