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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
为什么?怎么解决。

43 个回复

正序浏览
用户在录入的时候输入了一个整数就敲击了回车键。那么整数被nextInt接收了,整数后面是一个回车换行符,敲好nextLine的判断规则是遇到回车换行符就结束。因此当nextInt录入整数后用用nextLine录入字符串的时候只录入了整数,而字符串录入的是空串。解决方案是,全部用nextLine录入,然后对第一个录入的数据用Integer.parseInt()方法转换成整数。
回复 使用道具 举报
楼主,您好!很高兴回答您的问题!
根据您提出的问题,给出以下回答:
楼主遇到的问题是,输入第一个数完毕之后,系统不等待我们输入第二个字符,直接跳过第二个输入步骤,结果输出,对吧?
解决办法其实很简单,楼主可以试一下,将nextLine()改成  next(),其他不变,试试。本人试过,成功的哦。
原代码如下:
import java.util.Scanner;

public class Test04 {

        public static void main(String[] args) {
                String ch;
                int input=0;
                System.out.println("请输入一个整型数:");
                Scanner sc=new Scanner(System.in);
                input=sc.nextInt();
                System.out.println("请输入一个字符:");
                ch=sc.next();
                System.out.printf("您输入的整数是%d\n",input);
                System.out.printf("您输入的字符是%s",ch);
        }

}
原理很简单:
当我们需要输入一个数的时候,输完数字之后我们按回车结束我们的输入。这时其实我们是输入了两个数据,一个是我们输入的数据,另一个是字符"\n"代表回车。
楼主有没有了解过缓存区的原理?现在我们首先要了解系统输入的一个原理,就是我们输入完毕之后,系统是不是直接将我们输入的数据直接赋值给变量呢?答案是,不是的。
这里要提出一个概念,叫做缓存区。当我们输入数据一个数据,再按一个回车,结束我们的输入的时候,缓存区其实接收到了两个数据,一个我们输入的数据,一个就是我们输入的回车。
系统会先检查缓存区有没有数据,如果没有,把我们输入的这两个存储到缓存区,再从缓存区拿出来,依次赋给需要赋值的变量,如果缓存区没有数据,则会等待我们的输入,如果已经存在数据,则会跳过我们的输入,将缓存区紧接着的数据赋值给我们的下一个变量。所以才会产生您所说的这种情况。
纯手打的,满意请采纳,谢谢!
回复 使用道具 举报
我今天刚好发了碰到了一个类似的例子,针对这个我发了一个相关的贴子,现在举个例子回复你把:
  1. import java.util.Scanner;
  2. public class Score {
  3.         public static void main(String[] args) {
  4.                 int[][] score = new int[3][3];
  5.                 int i, j, k = 0;
  6.                 String[] subject = { "语文", "数学", "英语" };
  7.                 String[] name = new String[3];
  8.                 Scanner scan = new Scanner(System.in);
  9.                 for (i = 0; i < 3; i++) {
  10.                         System.out.println("请输入第" + (i + 1) + "个宝宝的名字");
  11.                         name[i] = scan.nextLine();
  12.                         for (j = 0; j < 3; j++) {
  13.                                 System.out.println("请输入" + name[i] + "的" + subject[j] + "成绩");
  14. /*这里我们若用下面第一语句,nextInt()录入一个整数的时候,其实录入的是整数和\r\n,因为在录完整数后会敲击回车键,\r\n就代表的回车键,而nextLine遇到\r\n就会录入结束*/
  15. //score[i][j] = scan.nextInt();
  16. //我们用下面语句就解决了问题
  17.                                 score[i][j] = Integer.parseInt(scan.nextLine());
  18.                         }
  19.                 }
  20.                 System.out.println(name[0] + name[1] + name[2]);
  21.         }
  22. }
复制代码
希望对你有帮助,不懂可以给我留言


回复 使用道具 举报
nextline()默认是以\r\n结束,在录入字符串的时候,回车一下,是的只能nextint(),有值,但是nextline就没有值
回复 使用道具 举报
自带回车键`代表结束
回复 使用道具 举报
Java中nextLine()自动读取了被nextInt()去掉的Enter作为他的结束符,所以没办法给nextInt(从键盘输入值。经本人验证,其他的nextXxx()的方法,如:nextDouble(), nextFloat() nextInt() 等与nextLine()连用时都存在这个问题!!!
解决的办法是:在每一nextDouble()、nextFloat()、nextInt()等语句之后加一个nextLine()语句!
将被next()去掉的Enter结束符过滤掉
方法如下:

  1. <div style="text-align: justify;"><font color="#333333" face="宋体" size="2"><span style="line-height: 28px;"><b>Scanner sc=new Scannsr(System.in);</b></span></font></div><div style="text-align: justify;"><font color="#333333" face="宋体" size="2"><span style="line-height: 28px;"><b>System.out.println("请输入一个数");</b></span></font></div><div style="text-align: justify;"><font color="#333333" face="宋体" size="2"><span style="line-height: 28px;"><b>int i=</b></span></font><b style="color: rgb(51, 51, 51); font-family: 宋体; font-size: small; line-height: 28px;">nextInt();</b></div><div style="text-align: justify;"><font color="#333333" face="宋体" size="2"><span style="line-height: 28px;"><b>sc.nextLine();</b></span></font></div><div style="text-align: justify;"><b style="color: rgb(51, 51, 51); font-family: 宋体; font-size: small; line-height: 28px;">System.out.println("请输入一个字符串");</b></div><div style="text-align: justify;"><b style="color: rgb(51, 51, 51); font-family: 宋体; font-size: small; line-height: 28px;">String s=sc.nextLine();</b></div><div style="text-align: justify;"><b style="color: rgb(51, 51, 51); font-family: 宋体; font-size: small; line-height: 28px;">......</b></div><div style="text-align: justify;"></div>
复制代码



回复 使用道具 举报
nextLine读到了换行符号,就运行结束啦
回复 使用道具 举报
Erry 中级黑马 2016-4-23 22:06:43
35#
其实吧,现阶段你只要记住他们分开用就好了!别混合用
回复 使用道具 举报
方法1 键盘输入
方法2 转换成toString类型
回复 使用道具 举报
方法1:直接键盘输入
回复 使用道具 举报
只能分开使用,nextInt()已经获取数据,后面的就无法获取了
回复 使用道具 举报
Amor~ 中级黑马 2016-4-19 20:20:18
31#
录入整数后按回车键  系统默认的\r\n使得录入字符时结束了   解答:全部录入字符,后面在转成你需要的整数
回复 使用道具 举报
真是高手在民间,应该好好向你们学习!!!
回复 使用道具 举报
主要原因:就是那个换行符号的问题。因为你先输入了一个整数,然后按了回车,而回车其实是\n,所以它把\n赋给了它,而\n为null,所以你看不见。
怎么解决:
方法一:先获取一个数值后,再创建一个新的键盘录入对象获取字符串。
方法二:把所有的数据都先按照字符串获取,然后要什么,你就对应的转换为什么。
回复 使用道具 举报
Scanner nsc = new Scanner(System.in);  用来录入整数
int number = nsc.nextInt();
Scanner csc = new Scanner(System.in);  用来录入字符串
String str = csc.nextLine();
回复 使用道具 举报
每周答题在哪里啊?还有怎么快速获得25技术分啊
回复 使用道具 举报
亲,我刚写了一篇关于这个的帖子,愿意及解决方案可以看一下,简单的有四种解决方法,你如果有其他方法可以给我留言额
回复 使用道具 举报
因为我们在输入1后,会按换行键,所以实际上录入的是1和\r\n , 所以sc.nextLine()是录入字符串的方法,遇到\r\n 就结束了
回复 使用道具 举报
创建两个Scanner对象,一个接受整数,一个接受字符串
回复 使用道具 举报
统一用nextLine()吧,nextInt()也就是在学习的前期用用,后面基本不用的
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马