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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© luheqi 中级黑马   /  2014-7-1 21:10  /  9544 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

如下:Scanner sc = new Scanner(System.in) ;        int i =0;
        while(sc.hasNextInt()){
             i++;

            String str = sc.nextLine();
            sc.nextLine();
            System.out.println"行号是"+i+":  "+str);

}
//结果:
1
2
行号是1:  1
3
4
行号是2:  3
5
6
行号是3:  5
7
8
行号是4:  7



//1 2 3 4 5 6 7 8 是键盘输入按回车结束。如此结果怎么解释??

评分

参与人数 1技术分 +2 收起 理由
轻语。 + 2

查看全部评分

11 个回复

倒序浏览
本帖最后由 cat73 于 2014-7-1 21:25 编辑

注意你调用了两次nextLine()
只有一次给str赋值
当然显示赋值的那一次
至于内个i 那根本就不是行号 那是第几次输出而已

你可以试试如下代码
  1.                 int i = 0;
  2.                 Scanner sc = new Scanner(System.in);
  3.                 String str;
  4.                
  5.         do{
  6.             str = sc.nextLine();
  7.             System.out.println("行号是" + ++i + ":" + str);
  8.         } while (sc.hasNextInt());
复制代码
  1. 1
  2. 行号是1:1
  3. 2
  4. 行号是2:2
  5. 3
  6. 行号是3:3
  7. 4
  8. 行号是4:4
  9. 5
  10. 行号是5:5
  11. 6
  12. 行号是6:6
  13. 7
  14. 行号是7:7
  15. 8
  16. 行号是8:8
复制代码




评分

参与人数 1技术分 +2 收起 理由
轻语。 + 2

查看全部评分

回复 使用道具 举报
cat73 发表于 2014-7-1 21:14
注意你调用了两次nextLine()
只有一次给str赋值
当然显示赋值的那一次

我想问的是nextLine()方法究竟干了什么,原理是什么。有人说什么吃掉回车,
我这里不仅仅吃掉回车,上一行的全吃掉了,是不是向Iterator中的next(),他那个是返回越过的元素,也只能删除越过的元素。
回复 使用道具 举报
luheqi 发表于 2014-7-1 21:29
我想问的是nextLine()方法究竟干了什么,原理是什么。有人说什么吃掉回车,
我这里不仅仅吃掉回车,上一 ...

首先,这种问题你应该学会查阅JAVA_API文档
然后,我给你解释下这个函数的用处吧
这个函数其实很简单,当你输入完一些东西之后按下回车则视为输入结束
输入的内容将被作为String返回

这个函数与next()不同点在于,next()什么都不输入直接敲回车不会返回
而nextLine()即使不输入东西直接敲回车也会返回
回复 使用道具 举报
cat73 发表于 2014-7-1 21:31
首先,这种问题你应该学会查阅JAVA_API文档
然后,我给你解释下这个函数的用处吧
这个函数其实很简单,当你 ...

情看我的刚刚发的另一帖子:nextLine()的重要作用  12行
http://bbs.itheima.com/thread-126697-1-1.html
(出处: 黑马程序员IT技术论坛)
这里nextLine 体现作用了,没有hui死循环。
回复 使用道具 举报
luheqi 发表于 2014-7-1 21:34
情看我的刚刚发的另一帖子:nextLine()的重要作用  12行
http://bbs.itheima.com/thread-126697-1-1.html ...

你内个里边的nextLine的作用是清空了缓冲区吧
Scanner的内部细节我没去了解过
我觉得是在抛出异常时没有清空缓冲区就执行了catch
因此这一句可以释放掉缓冲区
回复 使用道具 举报
cat73 发表于 2014-7-1 21:43
你内个里边的nextLine的作用是清空了缓冲区吧
Scanner的内部细节我没去了解过
我觉得是在抛出异常时没有 ...

嗯,这个解释还不错,不知道是否正确。细节方面不了解,官方的文档也不是说得很清楚。
回复 使用道具 举报
cat73 黑马帝 2014-7-1 21:47:12
8#
本帖最后由 cat73 于 2014-7-1 21:50 编辑
luheqi 发表于 2014-7-1 21:45
嗯,这个解释还不错,不知道是否正确。细节方面不了解,官方的文档也不是说得很清楚。 ...
  1.                 Scanner input = new Scanner(System.in);
  2.                
  3.                 try {
  4.                         input.nextInt();
  5.                 }catch(Exception e){
  6.                         System.out.println("Err!");
  7.                 }
  8.                 System.out.println(input.next());
复制代码
这段代码可以看出,第二次执行next()的时候根本不需要输入,而是直接用了上次输入的内容(当然你得让上次抛个异常)
基本可以证实输入上抛错的时候不会清理缓冲区

也就是说内部流程大概是 从输入流中获得数据->转换为int->清理缓冲区
如果在转换处出错则不清理缓冲区直接抛异常(无finally)
这大概是为了方便异常捕获程序获取具体错误值才这么做的吧
回复 使用道具 举报
本帖最后由 luheqi 于 2014-7-2 10:17 编辑
  1. Scanner sc = new Scanner(System.in);
  2.         int i = 0;
  3.         while (sc.hasNextInt()) {
  4.             i++;
  5.             String str = null;

  6.             str = sc.nextLine();
  7.             System.out.println("行号是" + i + ":  " + str);


  8.             sc.nextLine();
  9.             System.out.println("行" + i + ":  " + str);

  10.         }
复制代码


结果:
1
行号是1:  1
2
行1:  1
3
行号是2:  3
4
行2:  3
[size=11.818181991577148px]很显然,输入的2和4没被读入,是应该的,第二个nextLine的结果没返回给str。具体调试里面发生什么事,该如何做?

点评

很显然,输入的2和4没被读入,应该理解为: 再次调用后上上次结果????  发表于 2014-7-1 21:59
回复 使用道具 举报
cat73 黑马帝 2014-7-1 23:28:46
10#
luheqi 发表于 2014-7-1 21:56
结果:
1
行号是1:  1

你输出的是str
自然什么时候给str赋值
就输出什么
没给str赋值的部分会被抛弃掉
回复 使用道具 举报
本帖最后由 luheqi 于 2014-7-2 10:07 编辑
cat73 发表于 2014-7-1 23:28
你输出的是str
自然什么时候给str赋值
就输出什么

嗯,确实。但是。这个我没考虑清楚,但是我的另一帖子请看:nextLine()的重要作用  12行http://bbs.itheima.com/thread-126697-1-1.html
(出处: 黑马程序员IT技术论坛)

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马