美文网首页
sc.next() 和 nextLine 的原理

sc.next() 和 nextLine 的原理

作者: 满足我写点东西的需求 | 来源:发表于2018-09-13 12:06 被阅读0次

对java的Scanner类的next开头的相关类有点纠结,看了一些博客大致懂了,整理下
代码事例直接参考了这位大佬的
https://blog.csdn.net/long71751380/article/details/9400835

1. 总的原理

以一段代码为例,scanner类

import java.util.Scanner;
 
public class Next {
 
    public static void main(String[] args) {
        String s1, s2;
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个字符串:");
        s1 = sc.nextLine();
        System.out.println("请输入第二个字符串:");
        s2 = sc.next();
        System.out.println("输入的字符串是:" + s1 + "  " + s2);
    }
}

1.1 new Scanner(System.in)
以控制台为例,此时会提供控制台输入,输入的字符会到某缓存通道中A(也不知道专业名词叫什么)
继续执行后面的代码
1.2 sc.nextLine()
此时会从缓存通道A中开始读取数据,通道A中的游标(也不知道专业名词叫什么)初始位置为缓存通道A最前面,此时程序运行到nextLine(),该方法会做两件事情。
一是读取起始符到结束符中的数据,二是游标移动到结束符后(相当于把这段数据清空)

image.png

运行结果
(该部分引用那个博主例子start)
请输入第一个字符串:
ss
请输入第二个字符串:
dd
输入的字符串是:ss dd

但如果把程序改一下, s1=sc.next(); s2=sc.nextLine();

import java.util.Scanner;
 
public class Next {
 
    public static void main(String[] args) {
        String s1, s2;
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个字符串:");
        s1 = sc.next();
        System.out.println("请输入第二个字符串:");
        s2 = sc.nextLine();
        System.out.println("输入的字符串是:" + s1 + "  " + s2);
    }
}

运行结果

请输入第一个字符串:
ss
请输入第二个字符串:
输入的字符串是:ss

可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。例如上面的程序改写为:

import java.util.*;
public class Next {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入第一个字符串");
        String s1=sc.next();
        sc.nextLine();
        System.out.println("请输入第二个字符串");
        String s2=sc.nextLine();
        System.out.println("输入的字符串是"+s1+" "+s2);
    }
 
}

(该部分引用那个博主例子end)

相关文章

  • sc.next() 和 nextLine 的原理

    对java的Scanner类的next开头的相关类有点纠结,看了一些博客大致懂了,整理下代码事例直接参考了这位大佬...

  • 刷题踩坑笔记

    1、nextInt()和nextLine()连用(输入总是少一行) 问题分析: nextLine()会把nextI...

  • JAVA方法笔记

    字符串输入.next()和.nextLine()的区别 nextLine()方法返回的是Enter键之前的所有字符...

  • Next和nextLine()的区别

    Next和nextLine()的区别?在Scanner对象中,next读取时,遇到空格就结束,会自动过滤到有效字符...

  • java 接收控制台输入

    程序在运行到 in.nextLine() 的时候会阻塞程序运行,等待输入。两个 in.nextLine() 用户输...

  • Java中Scanner类的nextLine、nextInt、n

    问题描述当nextLine放置在next、nextInt之后,在输入第一行数据的时候,会自动跳过nextLine,...

  • Scanner用法

    一、常用方法next()、nextInt()和nextLine()的使用总结 例一 输出结果: nextInt()...

  • Scanner小问题

    nextLine() 问题 在连续两个输入并且第二个输入是 nextLine() 时,输入数据会产生错误。没有数据...

  • next()、nextInt()和nextLine()区别

    键盘录入字符串 Scanner类 : ​ next() : 遇到了空格, 就不再录入数据了 , 结束标记: 空...

  • Java中.next()和.nextLine()

    问题引入 刚学Java时经常使用到Scanner类,其接受键盘输入的字符串方法有两种: .next()和.next...

网友评论

      本文标题:sc.next() 和 nextLine 的原理

      本文链接:https://www.haomeiwen.com/subject/vohwgftx.html