黑马程序员技术交流社区

标题: Scanner的问题 [打印本页]

作者: star5603    时间: 2014-7-20 13:08
标题: Scanner的问题
本帖最后由 star5603 于 2014-7-20 19:48 编辑

看老毕的视频没有Scanner,但是好多地方都有,不是很懂。比如:
public static void main(String[] args) {
               
                Scanner in = new Scanner(System.in);
                boolean flag = true;//标记
               
                do {
                        try {
                                System.out.println("Enter a integer:");
                                int num = in.nextInt();
                                System.out.println("num:" + num);
                                //只要输入的数为正数,则循环结束
                                flag = false;
                        } catch (Exception e) {
                                System.out.println("the num is not a integer!");
                                in.nextLine();//就是这个地方不懂,为什么是nextLine()
                        }
                } while (flag);
        }
作者: SLJ_920808    时间: 2014-7-20 13:16
nextLine()方法的结束符是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。


作者: star5603    时间: 2014-7-20 14:28
SLJ_920808 发表于 2014-7-20 13:16
nextLine()方法的结束符是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空 ...

如果输入的不是整数,那为什么在控制台会重新显示“Enter a integer:”
作者: icris    时间: 2014-7-20 14:40
star5603 发表于 2014-7-20 14:28
如果输入的不是整数,那为什么在控制台会重新显示“Enter a integer:”

Do ... while(flag) 是个循环,只要 flag == true (循环条件)就会重复执行里面的代码(循环体),输入 int 类型时执行了 flag = false 退出循环,不是 int 则继续循环

作者: star5603    时间: 2014-7-20 15:01
icris 发表于 2014-7-20 14:40
Do ... while(flag) 是个循环,只要 flag == true (循环条件)就会重复执行里面的代码(循环体),输入  ...

擦,while循环永久了忘了do循环了。。。还有个问题,还是Scanner的nextLine()方法的具体功能,它返回的是什么呢。
作者: icris    时间: 2014-7-20 15:12
star5603 发表于 2014-7-20 15:01
擦,while循环永久了忘了do循环了。。。还有个问题,还是Scanner的nextLine()方法的具体功能,它返回的是 ...

测试一下:
String string = in.nextLine();
System.out.println(string);
输入 a ,会打印一个 a ,说明 nextInt() 没有读取输入的东西,nextLine() 读取了,如果去掉 nextLine() 则下一次循环的 nextInt() 仍然会读取这个 a ,形成死循环
试了一下果然死循环…

作者: star5603    时间: 2014-7-20 15:35
icris 发表于 2014-7-20 15:12
测试一下:
String string = in.nextLine();
System.out.println(string);

结果是你所说的,但是我还是没懂nextLine()的作用。。。
作者: a191170796    时间: 2014-7-20 15:43
public static int A()
        {
                for(;;)
                {
                        System.out.println("请输入任意正整数A:");
                       
                        Scanner sc = new Scanner(System.in);
                        if(!sc.hasNextInt())
                        {
                                System.out.println("输入有误请重新输入:");
                                continue;
                        }
                        else
                        {
                                int a = sc.nextInt();
                                return a;
                        }

                }
这种判断简洁一些,可以参考下!
作者: star5603    时间: 2014-7-20 15:52
a191170796 发表于 2014-7-20 15:43
public static int A()
        {
                for(;;)

额。。。
我主要是想弄明白nextLine()方法的具体实现。。。
作者: a191170796    时间: 2014-7-20 16:23
你那个地方的in.nextLine();返回一个String类型,因为你输入的如果不是Int形数据那么in.nextLine();将会接收,导致你的程序不至于输一个字符就程序错误!
作者: icris    时间: 2014-7-20 16:25
star5603 发表于 2014-7-20 15:52
额。。。
我主要是想弄明白nextLine()方法的具体实现。。。

当输入非 int 型字符串时,nextInt() 异常,运行 catch 中的代码,此时输入的字符串不会被读取。如果 catch 里是这样的:
  1. catch (Exception e) {
  2.         System.out.println("the num is not a integer!");
  3. }
复制代码

那么 catch 运行结束回到 while(flag) 判断,成立,继续循环,执行 int num = in.nextInt(); 此时 nextInt() 仍然读取第一次输入的非 int 型字符串,直接跳回 catch ,如此循环。
nextLine() 方法读取了刚才输入的非 int 型字符串,没有赋值给谁,也没有打印到什么地方,相当于把这个错误的非 int 型字符串扔掉了,把 in 清空,才能读取下一个输入
作者: star5603    时间: 2014-7-20 16:44
icris 发表于 2014-7-20 16:25
当输入非 int 型字符串时,nextInt() 异常,运行 catch 中的代码,此时输入的字符串不会被读取。如果 cat ...

哦。。。这样懂多了!非常感谢!
再问个,如果按你说的,那我改成要输入的是字符串,而后把nextInt()和nextLine()的位置调换,是不是也可以当前的效果?
作者: icris    时间: 2014-7-20 17:15
star5603 发表于 2014-7-20 16:44
哦。。。这样懂多了!非常感谢!
再问个,如果按你说的,那我改成要输入的是字符串,而后把nextInt()和ne ...

如果整个调换,不管输入什么,nextLine() 都能读取,永远不会跳到 catch 部分,会一直提示让你输入,输入完没有反应继续提示让你输入
作者: 苗润    时间: 2014-7-20 17:37
方法不知道什么意思  , 去下载个JAVA API 帮助文档
作者: star5603    时间: 2014-7-20 19:47
icris 发表于 2014-7-20 17:15
如果整个调换,不管输入什么,nextLine() 都能读取,永远不会跳到 catch 部分,会一直提示让你输入,输入 ...

嗯,我明白了!谢了!:handshake




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