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
相关产品推荐
相关产品推荐

