You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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("循环体执行了一次");
        }
    }
}

那实际执行流程会是这样:

  1. 第一次调用System.in.read(),假设你输入A后按回车,此时读取到A(ASCII码65),不等于'S'(ASCII码83),进入循环体执行1次。
  2. 循环结束后,执行i = System.in.read(),这次读取到的是回车产生的\r,还是不等于'S',于是循环体又执行1次。
  3. 接着再次执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:12:16