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

Java中Scanner如何正确读取字符串?输入exit无法触发判断如何解决

问题成因

核心问题并非Scanner使用逻辑错误,而是字符串比较方式不符合Java语法规则:

  • Java中==运算符作用于引用类型(如String)时,比较的是两个对象的内存地址是否一致,而非对象存储的内容
  • 代码中的字符串常量"exit"存储在JVM的字符串常量池中,而Scanner的nextLine()/next()方法返回的是堆上新创建的String对象,二者内存地址必然不同,因此command == "exit"永远返回false,无法进入对应分支
  • 同时while循环的判断条件command!="exit"也存在相同逻辑问题,即使if分支判断逻辑修正,循环也无法正常终止

正确实现方案

首先修正字符串比较逻辑:使用String类提供的equals()方法比较内容,为避免空指针异常,推荐将常量字符串放在方法调用方,格式为"exit".equals(command)。

修正后的完整代码如下:

import java.util.Scanner;

public class CommandInputTest {
    public static void main(String[] args) {
        String command = "";
        Scanner sc = new Scanner(System.in);
        // 循环条件改用equals比较字符串内容
        while (!"exit".equals(command)) {
            System.out.println("Please enter command: ");
            command = sc.nextLine();
            System.out.println("You enter: "+command);
            if ("exit".equals(command)) {
                System.out.println("Exit program.");
            }
        }
        sc.close();
    }
}

Scanner读取字符串的注意事项

  • next()方法:只会读取到空白符(空格、制表符、换行符)之前的内容,读取完成后不会消费输入流末尾的换行符
  • nextLine()方法:会读取整行所有内容,支持包含空格的输入,直到遇到换行符为止,读取完成后会消费输入流末尾的换行符
  • 如果之前调用过nextInt()、nextDouble()等仅读取数值的方法,需要额外调用一次nextLine()消费掉数值后面残留的换行符,避免后续的nextLine()读取到空内容

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:24:03