Java流程控制与Scanner类使用详解

发布时间:2026/10/14 11:33:37
Java流程控制与Scanner类使用详解 1. Java流程控制基础概述作为Java编程的核心基础流程控制是每个开发者必须掌握的技能。记得我刚学Java时常常被各种循环和条件语句绕得头晕直到真正理解了它们的执行逻辑才豁然开朗。流程控制就像交通信号灯指挥着程序执行的走向决定了代码的运行路径。在Java中流程控制主要分为三类顺序结构、选择结构和循环结构。顺序结构是最简单的代码从上到下依次执行选择结构如if和switch让程序能够根据不同条件执行不同代码块循环结构如while和for则用于重复执行特定代码。掌握这些结构的使用场景和特点是写出高效Java代码的前提。2. 用户输入处理Scanner类详解2.1 Scanner的基本使用Scanner是Java中用于获取用户输入的实用工具类位于java.util包中。在使用前需要先创建Scanner对象Scanner scanner new Scanner(System.in); // System.in表示标准输入流这里有个新手常犯的错误忘记导入java.util.Scanner包。我当年就因为这个问题调试了半天所以提醒大家一定要在文件开头加上import java.util.Scanner;2.2 next()与nextLine()方法对比这两个方法看似相似实则大不相同next()方法遇到空白符空格、Tab、回车就停止读取不读取空白符本身适合读取单个单词System.out.print(请输入); String input scanner.next(); // 输入Hello World只会读取HellonextLine()方法读取整行直到遇到回车会读取空白符适合读取完整句子System.out.print(请输入); String input scanner.nextLine(); // 输入Hello World会完整读取重要提示混合使用next()和nextLine()时容易出现问题。比如先用next()读取后立即用nextLine()会发现nextLine()直接跳过了。这是因为next()没有读取回车符而nextLine()会立即读取到那个回车。解决方法是在两者之间加一个额外的scanner.nextLine()来消耗掉多余的回车。2.3 资源关闭的必要性Scanner属于I/O资源使用后必须关闭以避免内存泄漏Scanner scanner new Scanner(System.in); // 使用代码... scanner.close(); // 使用完毕后关闭在Java 7之后更推荐使用try-with-resources语法可以自动关闭资源try (Scanner scanner new Scanner(System.in)) { // 使用代码... } // 自动关闭无需手动调用close()3. 选择结构深入解析3.1 if语句的多种形式3.1.1 单if结构最基本的条件判断只有条件为true时执行代码块if (score 60) { System.out.println(及格); }3.1.2 if-else结构二选一的情况if (score 60) { System.out.println(及格); } else { System.out.println(不及格); }3.1.3 多条件if-else if多个条件判断时使用if (score 90) { System.out.println(优秀); } else if (score 80) { System.out.println(良好); } else if (score 60) { System.out.println(及格); } else { System.out.println(不及格); }经验之谈条件判断的顺序很重要。如果把score 60放在最前面后面的条件就永远不会执行了。应该按照从严格到宽松的顺序排列条件。3.2 switch语句的妙用switch适合对单一变量进行多个值的等值判断switch (grade) { case A: System.out.println(优秀); break; case B: System.out.println(良好); break; // 其他case... default: System.out.println(未知等级); }3.2.1 break的重要性忘记写break会导致case穿透即继续执行下一个case的代码switch (grade) { case A: System.out.println(优秀); // 如果没有break会继续执行case B的代码 case B: System.out.println(良好); break; }有趣的是有时我们会故意利用case穿透特性来实现多个case共享同一段代码。3.2.2 Java 7后的字符串支持从Java 7开始switch支持String类型String name 张三; switch (name) { case 张三: System.out.println(你好张三); break; case 李四: System.out.println(你好李四); break; }实际上Java是通过比较字符串的hashCode()和equals()方法来实现的。4. 循环结构全面掌握4.1 while循环while循环先判断条件再决定是否执行int i 1; while (i 100) { System.out.println(i); i; }4.1.1 避免无限循环忘记更新循环变量会导致无限循环int i 1; while (i 100) { System.out.println(i); // 忘记i会导致无限循环 }4.2 do-while循环与while不同do-while至少执行一次循环体int i 1; do { System.out.println(i); i; } while (i 100);适用场景当需要至少执行一次操作时使用比如菜单显示、输入验证等。4.3 for循环for循环将初始化、条件判断和迭代操作集中在一行for (int i 1; i 100; i) { System.out.println(i); }4.3.1 增强for循环Java 5引入了增强for循环简化数组和集合的遍历int[] numbers {1, 2, 3, 4, 5}; for (int num : numbers) { System.out.println(num); }4.3.2 循环嵌套循环可以嵌套使用比如打印九九乘法表for (int i 1; i 9; i) { for (int j 1; j i; j) { System.out.print(j * i (i*j) \t); } System.out.println(); }5. 流程控制进阶技巧5.1 break和continue的灵活运用5.1.1 break的两种用法跳出当前循环for (int i 0; i 10; i) { if (i 5) { break; // 当i等于5时跳出循环 } System.out.println(i); }带标签的break跳出多层循环outerLoop: // 标签 for (int i 0; i 5; i) { for (int j 0; j 5; j) { if (i * j 6) { break outerLoop; // 直接跳出外层循环 } System.out.println(i , j); } }5.1.2 continue的使用跳过本次循环剩余代码直接进入下一次循环for (int i 0; i 10; i) { if (i % 2 0) { continue; // 跳过偶数 } System.out.println(i); // 只打印奇数 }5.2 打印等腰三角形实战这是一个综合运用循环和条件判断的经典例子for (int i 1; i 5; i) { // 打印空格 for (int j 1; j 5 - i; j) { System.out.print( ); } // 打印星号 for (int k 1; k 2 * i - 1; k) { System.out.print(*); } System.out.println(); }输出结果* *** ***** ******* *********调试技巧当循环结果不符合预期时可以在循环内部打印变量值观察每一步的变化。比如在打印星号的循环前加上System.out.println(ii jj kk);。6. 常见问题与最佳实践6.1 选择结构的性能考量当条件判断较多时超过5个switch通常比if-else效率更高对于区间判断如分数等级if-else更合适对于枚举值或固定值的等值判断switch更清晰6.2 循环优化的技巧减少循环内部的计算 将不随循环变化的计算移到循环外部// 不好的写法 for (int i 0; i list.size(); i) {...} // 好的写法 int size list.size(); for (int i 0; i size; i) {...}避免在循环中创建对象 特别是大对象会频繁触发垃圾回收使用合适的循环结构知道循环次数时用for需要至少执行一次时用do-while不确定循环次数时用while6.3 代码可读性建议添加清晰的注释 解释复杂逻辑的判断条件限制嵌套深度 过多的嵌套会使代码难以理解一般不超过3层使用有意义的变量名 避免使用i、j等简单命名可以用row、col等更具描述性的名称7. 实战练习与解决方案7.1 练习1数字金字塔编写程序打印如下数字金字塔1 121 12321 1234321 123454321解决方案for (int i 1; i 5; i) { // 打印前导空格 for (int j 1; j 5 - i; j) { System.out.print( ); } // 打印左半边数字 for (int k 1; k i; k) { System.out.print(k); } // 打印右半边数字 for (int l i - 1; l 1; l--) { System.out.print(l); } System.out.println(); }7.2 练习2素数判断编写程序判断一个数是否为素数只能被1和自身整除的数。解决方案Scanner scanner new Scanner(System.in); System.out.print(请输入一个整数); int num scanner.nextInt(); boolean isPrime true; if (num 1) { isPrime false; } else { // 只需检查到sqrt(num)即可 for (int i 2; i Math.sqrt(num); i) { if (num % i 0) { isPrime false; break; } } } System.out.println(num (isPrime ? 是素数 : 不是素数)); scanner.close();7.3 练习3猜数字游戏实现一个简单的猜数字游戏程序随机生成一个1-100的数字用户有10次猜测机会。解决方案Random random new Random(); int target random.nextInt(100) 1; // 1-100的随机数 int attempts 10; Scanner scanner new Scanner(System.in); System.out.println(猜数字游戏开始目标数字在1-100之间你有10次机会。); while (attempts 0) { System.out.print(请输入你的猜测剩余 attempts 次); int guess scanner.nextInt(); if (guess target) { System.out.println(恭喜你猜对了); break; } else if (guess target) { System.out.println(太小了); } else { System.out.println(太大了); } attempts--; } if (attempts 0) { System.out.println(很遗憾你没有猜对。正确答案是 target); } scanner.close();8. 调试技巧与常见错误8.1 常见编译错误缺少分号int i 5 // 编译错误缺少分号变量作用域问题for (int i 0; i 10; i) {...} System.out.println(i); // 错误i已经超出作用域switch语句中的常量重复switch (x) { case 1: ... break; case 1: ... break; // 错误case值重复 }8.2 逻辑错误排查使用调试器 现代IDE都提供调试功能可以设置断点、单步执行、查看变量值打印日志法 在关键位置添加打印语句观察程序执行流程System.out.println(进入循环i i);简化问题法 当遇到复杂问题时尝试简化代码逐步排查8.3 性能问题识别避免在循环中执行耗时操作 如IO操作、复杂计算等注意循环次数 特别是嵌套循环时间复杂度会成倍增加使用合适的数据结构 根据需求选择数组、ArrayList或LinkedList等9. 扩展知识与进阶学习9.1 递归与循环某些问题既可以用循环解决也可以用递归解决。比如计算阶乘循环实现int factorial 1; for (int i 1; i n; i) { factorial * i; }递归实现int factorial(int n) { if (n 0 || n 1) { return 1; } return n * factorial(n - 1); }递归代码更简洁但可能有栈溢出风险循环性能更好但代码可能更复杂。9.2 Java 8的流式操作Java 8引入了Stream API提供了更声明式的集合操作方式// 传统方式 int sum 0; for (int num : numbers) { if (num % 2 0) { sum num; } } // 流式操作 int sum numbers.stream() .filter(n - n % 2 0) .mapToInt(Integer::intValue) .sum();9.3 设计模式中的流程控制许多设计模式都巧妙运用了流程控制策略模式替代大量的if-else状态模式管理对象的状态转换责任链模式将请求沿着处理链传递10. 学习资源与下一步建议10.1 推荐学习资源书籍《Java核心技术 卷I》《Effective Java》《Java编程思想》在线教程Oracle官方Java教程Codecademy Java课程MOOC平台的相关课程实践平台LeetCodeHackerRankCodewars10.2 下一步学习建议深入理解面向对象 类与对象、继承与多态等概念掌握常用API 集合框架、IO流、多线程等学习异常处理 try-catch-finally机制项目实践 从小工具开始逐步构建完整应用学习编程就像学习一门新语言需要不断练习和实践。我在初学Java时每天坚持写代码从简单的练习题到小项目逐步积累经验。记住遇到问题不要气馁调试和解决问题的过程本身就是最好的学习机会。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询