zoukankan      html  css  js  c++  java
  • Scanner类nextInt方法的使用注意点

    一、先看一段正常的代码

    1. 一段用Scanner捕获键盘输入的代码:

    Scanner sc = new Scanner(System.in);
    // 先读取键盘输入的字符串
    System.out.println("input name :");
    String name = sc.nextLine();
    // 后读取键盘输入的int值
    System.out.println("input id :");
    int id = sc.nextInt();
    
    System.out.println("id = " + id + " name =[" + name + "]");
    System.out.println("execute finish !");

    2. 测试结果

    2.1 运行程序

    input name :
    lings //键盘输入
    input id :
    0 //键盘输入

    2.2 程序输出

    id = 0 name =[lings]
    execute finish !

    和预期一样。

    二、一个小变化,颠倒一下取值类型的顺序

    1. 一段改变了取值顺序的代码:

    Scanner sc = new Scanner(System.in);
    
    // 先读取键盘输入的int值
    System.out.println("input id :");
    int id = sc.nextInt();
    
    // 后读取键盘输入的字符串
    System.out.println("input name :");
    String name = sc.nextLine();
    
    System.out.println("id = " + id + " name =[" + name + "]");
    System.out.println("execute finish !");

    2. 测试结果

    2.1 运行程序

    input id :
    0 //键盘输入
    input name :

    2.2 程序输出

    id = 0 name =[]
    execute finish !

    咦?说好的阻塞呢?我还没输入字符串怎么就执行结束了???

    3. 原因如下:

    nextInt方法根据分隔符(回车,空格等)只取出输入的流中分割的第一部分并解析成Int,然后把后面的字节传递下去。
    所以,第二种情况键盘实际输入是“0+回车”,nextInt读出了“0”,并留下了“回车”,
    接着netxLine读到了一个“回车”,这是字符串的结束判定符啊,所以读到的字符串就是空字符串“”。

    4. 有点晕?继续测试:

    4.1 运行程序

    input id :
    0 lings //键盘输入
    input name :
    4.2 程序输出

    id = 0 name =[ lings] //注意空格
    execute finish !

    这下清楚了吗?

    三、使用注意事项

    需要从键盘输入多个参数,尽量把nextLine类型放前面,nextInt放后面,实在不行。

    nextInt后面要跟一个nextLine方法“消化”掉那个多余的字符串。

    1. 消化掉多余字符串的例子

    Scanner sc = new Scanner(System.in);
    
    System.out.println("input id :");
    int id = sc.nextInt();
    sc.nextLine();
    System.out.println("input name :");
    String name = sc.nextLine();
    
    System.out.println("id = " + id + " name =[" + name + "]");
    System.out.println("execute finish !");

    2. 测试结果

    2.1 运行程序
    input id :
    0
    input name :
    lings

    2.2 程序输出

    id = 0 name =[lings]
    execute finish !
  • 相关阅读:
    20165205 2017-2018-2 《Java程序设计》实验三 敏捷开发与XP实践
    20165205 2017-2018-2 《Java程序设计》第八周学习总结
    20165205 2017-2018-2《Java程序设计》结对编程一 第二周总结
    20165104 第一周学习心得
    Linux安装及命令入门
    做中学learning by doing个人感想
    我所期望的师生关系
    2018-2019 20165235《信息安全系统设计基础》第三周学习总结
    20165235 缓冲区溢出漏洞实验
    2018-2019-20165235 《信息安全系统设计基础》第二周学习总结
  • 原文地址:https://www.cnblogs.com/yoyotl/p/7457711.html
Copyright © 2011-2022 走看看