黑马程序员技术交流社区

标题: 关于Scaaner中nextLine()的问题 [打印本页]

作者: luheqi    时间: 2014-7-1 21:10
标题: 关于Scaaner中nextLine()的问题
如下: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 是键盘输入按回车结束。如此结果怎么解释??


作者: cat73    时间: 2014-7-1 21:14
本帖最后由 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
复制代码





作者: luheqi    时间: 2014-7-1 21:29
cat73 发表于 2014-7-1 21:14
注意你调用了两次nextLine()
只有一次给str赋值
当然显示赋值的那一次

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

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

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

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

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

嗯,这个解释还不错,不知道是否正确。细节方面不了解,官方的文档也不是说得很清楚。
作者: cat73    时间: 2014-7-1 21:47
本帖最后由 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-1 21:56
本帖最后由 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。具体调试里面发生什么事,该如何做?

作者: cat73    时间: 2014-7-1 23:28
luheqi 发表于 2014-7-1 21:56
结果:
1
行号是1:  1

你输出的是str
自然什么时候给str赋值
就输出什么
没给str赋值的部分会被抛弃掉
作者: luheqi    时间: 2014-7-2 10:01
本帖最后由 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技术论坛)






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