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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© star5603 高级黑马   /  2014-7-20 13:08  /  1288 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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);
        }

14 个回复

倒序浏览
nextLine()方法的结束符是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

回复 使用道具 举报
SLJ_920808 发表于 2014-7-20 13:16
nextLine()方法的结束符是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空 ...

如果输入的不是整数,那为什么在控制台会重新显示“Enter a integer:”
回复 使用道具 举报
star5603 发表于 2014-7-20 14:28
如果输入的不是整数,那为什么在控制台会重新显示“Enter a integer:”

Do ... while(flag) 是个循环,只要 flag == true (循环条件)就会重复执行里面的代码(循环体),输入 int 类型时执行了 flag = false 退出循环,不是 int 则继续循环
回复 使用道具 举报
icris 发表于 2014-7-20 14:40
Do ... while(flag) 是个循环,只要 flag == true (循环条件)就会重复执行里面的代码(循环体),输入  ...

擦,while循环永久了忘了do循环了。。。还有个问题,还是Scanner的nextLine()方法的具体功能,它返回的是什么呢。
回复 使用道具 举报
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 ,形成死循环
试了一下果然死循环…
回复 使用道具 举报
icris 发表于 2014-7-20 15:12
测试一下:
String string = in.nextLine();
System.out.println(string);

结果是你所说的,但是我还是没懂nextLine()的作用。。。
回复 使用道具 举报
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;
                        }

                }
这种判断简洁一些,可以参考下!
回复 使用道具 举报
a191170796 发表于 2014-7-20 15:43
public static int A()
        {
                for(;;)

额。。。
我主要是想弄明白nextLine()方法的具体实现。。。
回复 使用道具 举报
你那个地方的in.nextLine();返回一个String类型,因为你输入的如果不是Int形数据那么in.nextLine();将会接收,导致你的程序不至于输一个字符就程序错误!
回复 使用道具 举报
icris 中级黑马 2014-7-20 16:25:01
11#
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 清空,才能读取下一个输入

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
icris 发表于 2014-7-20 16:25
当输入非 int 型字符串时,nextInt() 异常,运行 catch 中的代码,此时输入的字符串不会被读取。如果 cat ...

哦。。。这样懂多了!非常感谢!
再问个,如果按你说的,那我改成要输入的是字符串,而后把nextInt()和nextLine()的位置调换,是不是也可以当前的效果?
回复 使用道具 举报
icris 中级黑马 2014-7-20 17:15:15
13#
star5603 发表于 2014-7-20 16:44
哦。。。这样懂多了!非常感谢!
再问个,如果按你说的,那我改成要输入的是字符串,而后把nextInt()和ne ...

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

嗯,我明白了!谢了!:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马