Java新手求助:这段使用Scanner读取字符串的代码存在什么问题?
你的Java代码中字符串读取的问题解析
嘿,作为Java新手能写出这样的代码已经很不错啦!咱们来聊聊这段代码里字符串读取部分的问题:
核心问题:scan.next()的局限性
scan.next() 方法的工作逻辑是读取到第一个空白字符(空格、换行、制表符等)就停止。举个例子:
如果你的输入是:
10 Hello World 3.14
那程序执行后:
i会拿到10s只会拿到"Hello",而后面的"World"会留在输入缓冲区里- 接下来读取
d的时候,程序会尝试把"World"转换成double类型,直接抛出InputMismatchException异常,程序崩溃
这就是最大的问题:它没法处理包含空格的字符串输入,而且会破坏后续的读取流程。
解决办法:用scan.nextLine()读取整行字符串
如果想要读取用户输入的完整一行字符串(包含空格),应该使用 scan.nextLine() 方法,但这里有个小坑需要注意:
前面的 scan.nextInt() 和 scan.nextDouble() 读取完数值后,会把输入末尾的换行符留在输入流中,直接调用 scan.nextLine() 会读取到这个空的换行符,导致拿到的字符串为空。所以需要先调用一次 scan.nextLine() 来消耗掉这个换行符。
修正后的代码如下:
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int i = scan.nextInt(); // 消耗掉nextInt()留下的换行符,避免影响后续的nextLine() scan.nextLine(); String s = scan.nextLine(); double d = scan.nextDouble(); System.out.println("String: " + s); System.out.println("Double: " + d); System.out.println("Int: " + i); } }
当然,如果你的业务场景能确保输入的字符串绝对不会包含空格,那 scan.next() 是可以正常工作的,但实际开发中用户输入往往不可控,所以用 nextLine() 处理整行输入会更稳妥。
内容的提问来源于stack exchange,提问作者AMOXE
相关产品推荐
相关产品推荐

