黑马程序员技术交流社区

标题: nextInt();与nextLine();方法 [打印本页]

作者: fighting2016    时间: 2016-4-3 19:18
标题: nextInt();与nextLine();方法
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
int x = sc.nextInt();
System.out.println("请输入一个字符串");
String line = sc.nextLine();
System.out.println("x = " + x + ",line = " + line);

输出结果为:
        请输入一个数
        1
        请输入一个字符串        
        x = 1,line =

为什么中间的String line = sc.nextLine();一句没有执行呢?

作者: Max灬xu    时间: 2016-4-3 19:18
fighting2016 发表于 2016-4-4 09:22
那么nextInt结束的标记是什么呢?

亲  我刚写了一篇关于这个的帖子,你不懂可以看一下,int 结束的标记是空格 tab回车换行,执行后不会换行....具体我就先不写了 ,我帖子上举例什么的都有,不懂@我就可以了
作者: 蓝色小宇宙    时间: 2016-4-3 19:46
nextLine()读到 \r\n就会认为已经到达末尾,结束方法了.
作者: aweilovemusic    时间: 2016-4-3 20:36
本帖最后由 aweilovemusic 于 2016-4-3 20:46 编辑

键盘录入有个特点:就拿你的案例来说,你输入完int类型时需要回车一次才可以运行窗口才出现结果,这时程序就以为输入了一个空的字符串,并且将int类型的数据和空字符串一起打印出来了
解决方案有2种:
第一次建立一个int类型,输第二次要录入入String类型时,需要建立string键盘录入对象(这样做耗内存,实际开发不推荐)                Scanner sc = new Scanner(System.in);
                System.out.println("请输入一个整数");
                int x = sc.nextInt();
                System.out.println("请输入一个字符串");
                Scanner sc2 = new Scanner(System.in);
                String y = sc2.nextLine();   
                System.out.println(y);   
                System.out.println("x="+x+"y="+y);
第二种方案就是全部都用string类型创建键盘录入对象:(这样做推荐使用,如果要把string类型转成int类型的话,可以用int的包装类inteeger类里面的方法去转换的)
                Scanner sc = new Scanner(System.in);
               System.out.println("请输入一个字符串");
                 String x = sc.nextLine();   
                System.out.println("请再输入一个字符串");
                 String y = sc.nextLine();        
                System.out.println("x="+x+"y="+y);

作者: fighting2016    时间: 2016-4-3 21:19
本帖最后由 fighting2016 于 2016-4-3 21:44 编辑
aweilovemusic 发表于 2016-4-3 20:36
键盘录入有个特点:就拿你的案例来说,你输入完int类型时需要回车一次才可以运行窗口才出现结果,这时程序 ...

问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一句话呢啊?
String line = sc.nextLine();怎么会接收到int x = sc.nextInt();的\r\n的呢?

问题二:
String line = sc.nextInt();  是怎么判断int数输入结束的呢?

作者: fighting2016    时间: 2016-4-3 21:21
本帖最后由 fighting2016 于 2016-4-3 21:43 编辑
蓝色小宇宙 发表于 2016-4-3 19:46
nextLine()读到 \r\n就会认为已经到达末尾,结束方法了.


问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一句话呢啊?
String line = sc.nextLine();怎么会接收到int x = sc.nextInt();的\r\n的呢?

问题二:
String line = sc.nextInt();  是怎么判断int数输入结束的呢?

作者: 爱拼的小伙子    时间: 2016-4-4 00:18
你用sc.nextInt()读一个int时如果是在一行上输入,然后按enter结束,scanner不会跳过结尾的'\n',而nextLine()的作用是跳过'\n'并返回被跳过的字符串,所以你下次nextLine()的调用由于缓冲区里已经有一个'\n'
作者: 爱拼的小伙子    时间: 2016-4-4 00:19
爱拼的小伙子 发表于 2016-4-4 00:18
你用sc.nextInt()读一个int时如果是在一行上输入,然后按enter结束,scanner不会跳过结尾的'\n',而nextLin ...

楼主你可以把nextInt()和nextLine()互换下位置就能证明这个结论了
作者: 凡沉乡    时间: 2016-4-4 00:39
想得到预期结果俩个不能一起用,nextline会把你的回车键当做输入的字符给输出了,可以来俩个nextline达到目的
作者: Max灬xu    时间: 2016-4-4 01:03
执行了,因为你上句输入inT值后会输入一个回车换行键,上句执行完后把1拿走了,下句NEXTLINE上来就碰到一个回车换行键,而nextline输入字符串结束的标记就是回车,系统会认为这句话已经执行完了,即line得到的只是一个空字符串,即line="";改进方法1:可以用next()代替nextline(),因为next无视有效字符串前的回车;改进方法2,重新new一个对输入对象,改进方法三:换位置到最上。
作者: fighting2016    时间: 2016-4-4 09:22
Max灬xu 发表于 2016-4-4 01:03
执行了,因为你上句输入inT值后会输入一个回车换行键,上句执行完后把1拿走了,下句NEXTLINE上来就碰到一个 ...

那么nextInt结束的标记是什么呢?
作者: fighting2016    时间: 2016-4-4 09:23
爱拼的小伙子 发表于 2016-4-4 00:18
你用sc.nextInt()读一个int时如果是在一行上输入,然后按enter结束,scanner不会跳过结尾的'\n',而nextLin ...

问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一句话呢啊?
String line = sc.nextLine();怎么会接收到int x = sc.nextInt();的\r\n的呢?

问题二:
String line = sc.nextInt();  是怎么判断int数输入结束的呢?

作者: 我认识你    时间: 2016-4-4 09:53
执行了      “x = 1,line = ”就是输入的字符串的内容么
作者: adomwon    时间: 2016-4-4 10:01
回车时的/r/n赋给了line
作者: 菊花爆满山    时间: 2016-4-4 10:12
同意楼上的,windows的行分隔符是\r\n,也就是回车符,nextLine()这个方法遇到\r\n即结束,所以没有读到任何内容。   ps:你可去查下源码
作者: 爱拼的小伙子    时间: 2016-4-4 10:39
fighting2016 发表于 2016-4-4 09:23
问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一 ...

问题一答:System.out.println("请输入一个字符串");这是一个打印字符到控制台的语句,只起了一个提示作用,并不能影响到任何语句流程。
问题二答:String line = sc.nextInt(); 是通过回车enter键判断输入结束的,而转义字符\r和enter键的作用相同

作者: 雨伞    时间: 2016-4-4 11:55
因为我们在输入1后,会按换行键,所以实际上录入的是1和\r\n , 所以sc.nextLine()是录入字符串的方法,遇到\r\n 就结束了
作者: 小哒哒    时间: 2016-4-4 14:18
nextLine()方法一般不与别的键盘录入共用一个键盘录入对象,需要重新创建一个他自己的键盘录入对象.因为nextLine是遇到回车换行以后录入就结束了,而你在第一次键盘录入数字数字输入一个数字后,nextInt方法将你输入的数字拿走,其实这时候数字末尾还会有空白字符,就是回车换行.紧接着在你录入字符串之前nextline方法已经获取了回车换行字符,而这个字符标志着nextline方法的结束,所以你再输入字符串时,键盘并不会录入了,所以什么都没输出.   
作者: 小灰辉    时间: 2016-4-4 15:15
这是因为 啊 第一次 接收 int数的时候 输入一个数 会有一个回车符. 这个时候呢 string 会默认接收这个回车符./r/t
所以 打印出这个结果
作者: hm_hjj    时间: 2016-4-4 18:03
        int x = sc.nextInt();                //获取一个整型数,后面有 \r\n
        String line = sc.nextLine();        //获取一个字符串

          在键盘上录入的是一个int数和\r\n,nextInt()方法只获取int数就结束了,而nextLine()只要遇到\r\n就证明一行结束,因此字符串没有机会键盘录入
               
               
作者: 蓝色小宇宙    时间: 2016-4-4 18:46
fighting2016 发表于 2016-4-3 21:21
问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一 ...

println("请输入一个字符串") 就是输出"请输入一个字符串"后,输入了/r/n才能达到换行的效果呀,print()与println()的差别就是在这里.  nextLine()读取到的/r/n就是println()的

String line = sc.nextInt(); 这根本编译不了的啊,应该用int来接受的
作者: zx7750462    时间: 2016-4-4 20:30
楼上的都说完了,没什么好补充的了
作者: sasami    时间: 2016-4-4 20:45
fighting2016 发表于 2016-4-3 21:19
问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一 ...

答:
1,系统有一个叫键盘缓冲区的地方,nextInt()之取了缓冲区的int部分,后面留下的换行符被下一句提取了;
2,int x = sc.nextInt();是以换行符作为结束标志的。

解决方法上面有提到,补充一下,Integer.parseInt(line)即可将字符串转换为int。
参考:public static int parseInt(String s)     
作者: huhemingtiancai    时间: 2016-4-4 21:54
第一次  读取字符1  然后第一次读取字符的程序就结束了  
作者: huhemingtiancai    时间: 2016-4-4 21:55
第一次  读取字符1  然后第一次读取字符的程序就结束了  ,第二个读取运行时,会碰到回车,然后直接结束,对于他来说什么也没有得到,里面是空的
作者: 2290237416    时间: 2016-4-4 22:00
没有录入字符串
作者: yangxiong    时间: 2016-4-4 22:36

nextIne()是键盘录入整数的方法,当我们录入一个整数的 的时候,其实在键盘在录入的是这个数字和\r\n,
               
,nextLine()是键盘录入字符串的方法,可以接受任意类型的数据,但是他凭什么能获取
                一行呢?通过\r\n,只要碰到\r\n就结束了
所以当你前面输入整数,下面紧跟着输入字符时,当你输入一个整数后,系统默认后面加上了\r\n,这个\r\n,被nextLine()接收就代表结束了,所以控制台就显示你输入的整数,下面就是空格了,撒都没有
作者: liang1995918    时间: 2016-4-5 01:06
字符串直接用next()接收就行了!无任何bug!
作者: 成汉思鸡    时间: 2016-4-5 17:57
nextLine()读到 \r\n就会认为已经到达末尾,结束方法了.
可以创建两个scanner对象或者都存储字符串,推荐使用后者
作者: LiuLiu006    时间: 2016-4-5 19:12
路虎....................
作者: 李-超    时间: 2016-4-5 21:12
程序把回车当做了字符串,赋给了line,打印的结果就是什么也看不到
作者: fffsss    时间: 2016-4-5 22:24
哥们,这句有再执行的。只不过是系统执行后导入到内存里去的
作者: caoshengwei    时间: 2016-4-6 00:35
前面是读取int型数据,后面是读字符串数据
作者: 15614014298    时间: 2016-4-6 11:05
nextInt()接收的数据类型是整型,以回车键结束(\r\n),需主要类型是否相符和上下限的问题,否则会有异常。
nextLine()接受的数据类型是字符串,以回车键结束(\r\n)。
作者: Sun.    时间: 2016-4-7 01:23
解决方法有两个
1,再创建一个键盘录入对象用于接受string字符串,不过这样的话浪费内存空间
2,都用nextline接收,然后再将字符串转换为int类型,一般都用这种方法
作者: dempseyAD    时间: 2016-4-7 12:53
nextline读到了回车
作者: z466507943    时间: 2016-4-7 20:22
string line = sc。next line   遇到/r/n  就结束了
作者: 丶半度微凉    时间: 2016-4-7 21:55
不明觉厉,慢慢就会懂的
作者: 可可TKD    时间: 2016-4-7 23:13
在new一次,当你敲回车时,已经结束了
作者: 123liu123    时间: 2016-4-7 23:46
因为nextLine()读到 \r\n就会认为已经到达末尾,结束方法了,遇到前边输入整数是的\r\n就会停止,所以会出现问题
作者: 兵蜂    时间: 2016-4-8 23:31
是不是在程序执行时,多敲了一次"Enter"键呀,老兄
作者: fighting2016    时间: 2016-4-9 21:36
兵蜂 发表于 2016-4-8 23:31
是不是在程序执行时,多敲了一次"Enter"键呀,老兄


没啊,全程只一次enter啊

作者: lennycxy    时间: 2016-4-15 23:52
又涨知识了
作者: MyName    时间: 2016-6-29 22:10
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
int x = sc.nextInt();
System.out.println("请输入一个字符串");
sc.nextLine();//加入一行,接受转义字符
String line = sc.nextLine();
System.out.println("x = " + x + ",line = " + line);

作者: linguoqun    时间: 2016-8-2 07:20
好简单哦。早知道我来解答好了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2