为何for循环内的代码每次会执行两次?求技术解析
为什么你的for循环体每次会执行两次?
嘿,我来帮你搞清楚这个问题!核心原因出在你用的System.in.read()的读取逻辑上,咱们一步步拆解:
问题根源:System.in.read()的字节读取特性
你用的System.in.read()是按单个字节读取输入的,但咱们在控制台输入字符后按回车时,实际输入的内容不止你输入的那个字符——回车操作会被系统解析成两个控制字符:\r(回车符,ASCII码13)和\n(换行符,ASCII码10),这两个字符都会被read()依次读取。
假设你的for循环大概是这样的(结合你提供的代码片段还原):
class Example { public static void main(String args[]) throws java.io.IOException { for(int i = System.in.read(); i != 'S'; i = System.in.read()) { // 你的循环体代码,比如打印一句提示 System.out.println("循环体执行了一次"); } } }
那实际执行流程会是这样:
- 第一次调用
System.in.read(),假设你输入A后按回车,此时读取到A(ASCII码65),不等于'S'(ASCII码83),进入循环体执行1次。 - 循环结束后,执行
i = System.in.read(),这次读取到的是回车产生的\r,还是不等于'S',于是循环体又执行1次。 - 接着再次执行
i = System.in.read(),读取到\n,依然不等于'S',循环体还会再执行1次(Windows系统下);你说的“执行两次”可能是场景差异,但本质都是额外的控制字符被读取导致的。
解决办法
方法1:用Scanner类简化输入处理(推荐)
Scanner会自动忽略换行、空格这类空白字符,直接读取你输入的有效字符/字符串,避免字节读取的麻烦:
import java.util.Scanner; class Example { public static void main(String args[]) { Scanner scanner = new Scanner(System.in); String input; do { input = scanner.next(); // 替换成你的循环体代码 System.out.println("循环体执行了一次"); } while (!input.equals("S")); scanner.close(); } }
方法2:手动跳过控制字符(如果坚持用System.in.read())
在循环里判断读取到的字节是不是\r或\n,如果是就跳过,不执行循环体逻辑:
class Example { public static void main(String args[]) throws java.io.IOException { int i; while ((i = System.in.read()) != 'S') { // 跳过回车和换行符 if (i == '\r' || i == '\n') { continue; } // 你的循环体代码 System.out.println("循环体执行了一次"); } } }
内容的提问来源于stack exchange,提问作者user6268615
相关产品推荐
相关产品推荐

