青岛开发区建网站哪家好访问不了服务器的网站
2026/2/17 14:15:40 网站建设 项目流程
青岛开发区建网站哪家好,访问不了服务器的网站,网站新闻源码,跳转网站代码一文吃透Java中Scanner类的用法#xff1a;从入门到实战避坑你有没有遇到过这样的情况#xff1f;写了个简单的控制台程序#xff0c;用户输入一个数字后#xff0c;接下来要读取一句话#xff0c;结果nextLine()居然直接“跳过了”#xff01;或者在算法题里反复提交失败…一文吃透Java中Scanner类的用法从入门到实战避坑你有没有遇到过这样的情况写了个简单的控制台程序用户输入一个数字后接下来要读取一句话结果nextLine()居然直接“跳过了”或者在算法题里反复提交失败只因为多了一个换行符没处理好。别急这背后大概率是Scanner的使用姿势不对。作为 Java 初学者接触最早的输入工具之一Scanner看似简单实则暗藏玄机。今天我们就来彻底搞懂它——不只是怎么用更要明白为什么这么用。为什么是 Scanner在 Java 中想要从键盘获取用户输入最直观的方式就是Scanner。它位于java.util.Scanner包下设计初衷就是为了简化文本解析过程。尤其对于刚学编程的同学来说比起复杂的流操作几行代码就能读整数、读字符串简直不要太友好。更重要的是在 LeetCode、牛客网、蓝桥杯等主流平台中标准输入往往通过System.in提供而Scanner正好能无缝对接。可以说掌握它的正确用法是你刷题和做小项目的“基本功”。但问题是很多人只记住了方法名却忽略了它们之间的行为差异最终掉进了“输入残留”的经典陷阱。我们先来看一个最常见的问题场景Scanner sc new Scanner(System.in); System.out.print(请输入年龄: ); int age sc.nextInt(); System.out.print(请输入姓名: ); String name sc.nextLine(); // 这里竟然读不到运行时你会发现“请输入姓名”刚打印出来程序就仿佛自动跳过了输入直接往下走了。这是怎么回事答案就在nextInt()和nextLine()的工作机制不同上。核心机制Scanner 是如何工作的Scanner并不是逐字节读取输入而是把整个输入当作一个“流”内部维护着一个缓冲区并按“token”令牌进行拆分。默认情况下它的分隔符是任意空白字符空格、制表符、换行符也就是说除了nextLine()所有nextXxx()方法都会自动跳过前导空白然后读取直到下一个空白之前的内容。关键点来了-nextInt()会读取数字部分但不会消费后面的换行符- 而nextLine()的任务是从当前位置一直读到下一个换行符为止- 所以当你调用完nextInt()后立刻调用nextLine()后者其实是在“吃掉”那个残留的换行符于是返回了一个空字符串。这就解释了上面那个“跳过输入”的现象。如何解决加一行清理即可int age sc.nextInt(); sc.nextLine(); // 手动清空缓冲区中的换行符 String name sc.nextLine(); // 现在可以正常输入了记住这个模式只要你在nextXxx()之后要用nextLine()就必须先手动调用一次nextLine()来清除残余。常用方法详解与最佳实践下面我们逐一拆解Scanner的核心 API结合实际场景讲清楚每个方法该怎么用、什么时候用、有哪些坑。✅nextInt()/nextDouble()读取基本类型这两个是最常用的数值输入方法适用于读取整数或浮点数。System.out.print(请输入分数: ); double score scanner.nextDouble();优点- 自动完成字符串转数字- 如果输入非法比如输入“abc”会抛出InputMismatchException建议搭配hasNextXxx()使用以增强健壮性while (!scanner.hasNextDouble()) { System.out.println(请输入有效的数字); scanner.next(); // 清除非法输入 } double score scanner.nextDouble();这里的关键在于hasNextDouble()只判断不消费如果验证失败需要用next()把错误内容“扔掉”否则会陷入死循环。✅next()vsnextLine()一字之差天壤之别方法行为说明next()读取下一个由空白分隔的单词不能包含空格nextLine()读取当前行剩余全部内容包括空格直到遇到换行举个例子输入张三 今年 20 岁scanner.next()→ 得到张三再次调用 →今年再调用 →20但如果用nextLine()在同一行后续调用就会得到 今年 20 岁注意开头有空格。所以如果你想读一句话比如“我喜欢编程”里面有空格那就必须用nextLine()。常见误区以为next()能读带空格的名字 —— 实际上只能读第一个词。✅ 正确做法System.out.print(请输入完整姓名: ); String fullName scanner.nextLine();✅hasNextXxx()让输入更安全在不知道用户要输多少数据的情况下hasNextInt()这类方法非常有用。典型应用场景OJ系统接收多组测试数据。System.out.println(持续输入整数非数字结束:); while (scanner.hasNextInt()) { int n scanner.nextInt(); System.out.println(收到: n); } // 当输入 abc 时循环自然退出这种方式避免了硬编码输入次数也防止因类型错误导致程序崩溃。✅useDelimiter(String pattern)自定义分割规则默认是按空白拆分但如果你处理的是 CSV 文件或特定格式的数据就需要改分隔符。例如读取逗号分隔的水果列表String data 苹果,香蕉,橘子; Scanner scanner new Scanner(data); scanner.useDelimiter(,); while (scanner.hasNext()) { System.out.println(水果: scanner.next()); } scanner.close();输出水果: 苹果 水果: 香蕉 水果: 橘子你甚至可以用正则表达式设置复杂分隔符比如.useDelimiter([,;\\s])表示逗号、分号或空白都可作为分隔。✅close()别忘了关资源虽然从System.in创建的Scanner关不关影响不大但在读文件时必须关闭否则可能造成资源泄漏。推荐写法Java 7try (Scanner scanner new Scanner(new File(scores.txt))) { while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { System.err.println(文件未找到); }这就是所谓的try-with-resources语法自动帮你调用close()代码更简洁、更安全。实战案例学生信息录入系统我们来写一个完整的交互式程序综合运用上述技巧实现一个带输入校验的学生信息录入系统。import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class StudentRecorder { public static void main(String[] args) { ListStudent students new ArrayList(); Scanner scanner new Scanner(System.in); System.out.println( 学生信息录入系统 ); System.out.println(输入 quit 结束录入); while (true) { System.out.print(\n姓名: ); String name scanner.nextLine(); if (quit.equalsIgnoreCase(name)) break; // 安全读取年龄 System.out.print(年龄: ); while (!scanner.hasNextInt()) { System.out.println(请输入有效数字); scanner.next(); // 清除非法输入 } int age scanner.nextInt(); scanner.nextLine(); // 清除换行 // 安全读取成绩 System.out.print(成绩: ); while (!scanner.hasNextDouble()) { System.out.println(请输入有效分数); scanner.next(); } double score scanner.nextDouble(); scanner.nextLine(); // 清除换行 students.add(new Student(name, age, score)); System.out.println(【已保存】 name); } System.out.println(\n✅ 录入完成共 students.size() 人); students.forEach(System.out::println); scanner.close(); } } class Student { private final String name; private final int age; private final double score; public Student(String name, int age, double score) { this.name name; this.age age; this.score score; } Override public String toString() { return String.format( %s | 年龄: %d | 成绩: %.1f, name, age, score); } }这个程序解决了几个关键问题- 输入中断保护用hasNextXxx()检查类型合法性- 错误恢复非法输入不会导致程序崩溃- 缓冲清理每次读完基本类型后立即清理换行- 用户体验提示清晰支持中途退出- 资源管理最后调用了close()。性能提醒Scanner 不适合大数据量场景尽管Scanner使用方便但它毕竟是封装层较厚的工具类底层做了大量正则匹配和异常处理性能远不如原始流。如果你在处理百万级数据输入如大型 OJ 题目建议改用BufferedReader br new BufferedReader(new InputStreamReader(System.in)); String line br.readLine(); int n Integer.parseInt(line);或者配合StringTokenizer提高效率StringTokenizer st new StringTokenizer(br.readLine()); while (st.hasMoreTokens()) { int num Integer.parseInt(st.nextToken()); }这类组合虽然代码稍长但速度更快内存占用更低是竞赛选手的首选。最佳实践总结场景推荐做法读整数/浮点数优先使用nextInt()/nextDouble()读带空格字符串必须用nextLine()混合调用前后nextXxx()后接nextLine()记得加一次nextLine()清缓冲输入验证使用hasNextXxx()next()清错特殊格式数据设置useDelimiter()文件读取务必使用 try-with-resources高性能需求改用BufferedReader parseInt如果你正在学习 Java或是准备参加算法竞赛不妨把这篇文章收藏起来。下次再遇到“输入莫名其妙跳过”的问题你就知道该去哪找答案了。掌握Scanner不只是学会几个方法更是理解输入流、缓冲机制和类型转换的第一步。它是通向更高级 I/O 模型的起点也是写出健壮交互程序的基础能力。你现在对Scanner还有什么疑惑吗欢迎在评论区留言讨论

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询