A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fighting2016 中级黑马   /  2016-4-3 19:18  /  16286 人查看  /  44 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
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();一句没有执行呢?

最佳答案

查看完整内容

亲 我刚写了一篇关于这个的帖子,你不懂可以看一下,int 结束的标记是空格 tab回车换行,执行后不会换行....具体我就先不写了 ,我帖子上举例什么的都有,不懂@我就可以了

44 个回复

倒序浏览
fighting2016 发表于 2016-4-4 09:22
那么nextInt结束的标记是什么呢?

亲  我刚写了一篇关于这个的帖子,你不懂可以看一下,int 结束的标记是空格 tab回车换行,执行后不会换行....具体我就先不写了 ,我帖子上举例什么的都有,不懂@我就可以了
回复 使用道具 举报
nextLine()读到 \r\n就会认为已经到达末尾,结束方法了.
回复 使用道具 举报
本帖最后由 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: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: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数输入结束的呢?
回复 使用道具 举报
你用sc.nextInt()读一个int时如果是在一行上输入,然后按enter结束,scanner不会跳过结尾的'\n',而nextLine()的作用是跳过'\n'并返回被跳过的字符串,所以你下次nextLine()的调用由于缓冲区里已经有一个'\n'
回复 使用道具 举报
爱拼的小伙子 发表于 2016-4-4 00:18
你用sc.nextInt()读一个int时如果是在一行上输入,然后按enter结束,scanner不会跳过结尾的'\n',而nextLin ...

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

那么nextInt结束的标记是什么呢?
回复 使用道具 举报
爱拼的小伙子 发表于 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数输入结束的呢?
回复 使用道具 举报
执行了      “x = 1,line = ”就是输入的字符串的内容么
回复 使用道具 举报
回车时的/r/n赋给了line
回复 使用道具 举报
菊花爆满山 来自手机 中级黑马 2016-4-4 10:12:59
15#
同意楼上的,windows的行分隔符是\r\n,也就是回车符,nextLine()这个方法遇到\r\n即结束,所以没有读到任何内容。   ps:你可去查下源码
回复 使用道具 举报
fighting2016 发表于 2016-4-4 09:23
问题一:
可是在String line = sc.nextLine();之前还有System.out.println("请输入一个字符串");这样的一 ...

问题一答:System.out.println("请输入一个字符串");这是一个打印字符到控制台的语句,只起了一个提示作用,并不能影响到任何语句流程。
问题二答:String line = sc.nextInt(); 是通过回车enter键判断输入结束的,而转义字符\r和enter键的作用相同
回复 使用道具 举报
因为我们在输入1后,会按换行键,所以实际上录入的是1和\r\n , 所以sc.nextLine()是录入字符串的方法,遇到\r\n 就结束了
回复 使用道具 举报
nextLine()方法一般不与别的键盘录入共用一个键盘录入对象,需要重新创建一个他自己的键盘录入对象.因为nextLine是遇到回车换行以后录入就结束了,而你在第一次键盘录入数字数字输入一个数字后,nextInt方法将你输入的数字拿走,其实这时候数字末尾还会有空白字符,就是回车换行.紧接着在你录入字符串之前nextline方法已经获取了回车换行字符,而这个字符标志着nextline方法的结束,所以你再输入字符串时,键盘并不会录入了,所以什么都没输出.   
回复 使用道具 举报
这是因为 啊 第一次 接收 int数的时候 输入一个数 会有一个回车符. 这个时候呢 string 会默认接收这个回车符./r/t
所以 打印出这个结果
回复 使用道具 举报
        int x = sc.nextInt();                //获取一个整型数,后面有 \r\n
        String line = sc.nextLine();        //获取一个字符串

          在键盘上录入的是一个int数和\r\n,nextInt()方法只获取int数就结束了,而nextLine()只要遇到\r\n就证明一行结束,因此字符串没有机会键盘录入
               
               
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马