`
yx1989
  • 浏览: 10566 次
  • 性别: Icon_minigender_1
  • 来自: 烟台
社区版块
存档分类
最新评论

Scanner的用法误区

 
阅读更多

本文转载自 http://bianku.iteye.com/blog/399715

感谢 bianku  

今天做java的实训的第3题,其中用到了Scanner;写了下面一段代码

Java代码 
  1. Student a=new Student();  
  2.         Scanner in = new Scanner(System.in);  
  3.         System.out.println("请输入学生的姓名: ");                 
  4.         a.setName(in.nextLine());  
  5.         System.out.println("请输入学生的年龄: ");  
  6.         a.setAge(in.nextInt());  
  7.         System.out.println("请输入学生所在城市: ");  
  8.         a.setCity(in.nextLine());  
  9.         System.out.println("请输入学生家所在的小区单元: ");  
  10.         a.setAddr(in.nextLine());  
  11.         System.out.println("请输入邮政编码: ");  
  12.         a.setPostcode(in.nextInt());  
  13.         System.out.println("请输入学生的出生日期: ");  
  14.         a.setDate(in.nextLine());  
  15.         System.out.println("******************************");  
  16.         a.showStudent();  

 貌似没错,也能运行。看下执行的过程发现输入年龄后

“请输入学生所在城市:

请输入学生家所在的小区单元:”一起跳出来了

这样:

Java代码 
  1. 请输入学生的姓名:   
  2. 张三  
  3. 请输入学生的年龄:   
  4. 21  
  5. 请输入学生所在城市:   
  6. 请输入学生家所在的小区单元:   
  7. 常州  
  8. 请输入邮政编码:   
  9. 222314  
  10. 请输入学生的出生日期:   
  11. ******************************  
  12. 该学生的信息为:  
  13. 姓名:张三  
  14. 年龄:21  
  15. 家庭住址:常州  
  16. 邮政编码:222314  
  17. 出生日期:  

 晕,为什么呢?再看一下代码,仿佛没错呀?此时想到了C语言里好像也有类似的现象,当用getchar输入两行字符时

中间要加一个getchar();用来接收回车键。这里会不会也是类似的情况呢?没有接受便直接跳到下一行了,看这架势有点像。看一下API:API上的解释 
nextLine 
public String nextLine() 
此扫描器执行当前行,并返回跳过的输入信息。 
此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。

分隔符被nextLine()接受了?

于是写了一个验证的代码:

Java代码 
  1. int n =in.nextInt() ;  
  2. String s1 = in.nextLine();   
  3. String s2 = in.nextLine();   
  4. 输入:  
Java代码 
  1. 12   
Java代码 
  1. I LOVE YOU  
Java代码 
  1. LOVE YOU  

 

结果应该是什么呢?如果是:

12

I LOVE YOU  那就说明猜想正确了!

运行后发现,果然是这样的,哈哈,和C语言的一样啊

那就仿照着解决下:加一个 in.nextLine();试试:

Java代码 
  1. Student a=new Student();  
  2.   Scanner in = new Scanner(System.in);  
  3.   System.out.println("请输入学生的姓名: ");      
  4.   a.setName(in.nextLine());  
  5.   System.out.println("请输入学生的年龄: ");  
  6.   a.setAge(in.nextInt());  
  7.      in.nextLine();//加在这!!  
  8.   System.out.println("请输入学生所在城市: ");  
  9.   a.setCity(in.nextLine());  
  10.   System.out.println("请输入学生家所在的小区单元: ");  
  11.   a.setAddr(in.nextLine());  
  12.   System.out.println("请输入邮政编码: ");  
  13.   a.setPostcode(in.nextInt());  
  14.   in.nextLine();//还有这!!!  
  15.   System.out.println("请输入学生的出生日期: ");  
  16.   a.setDate(in.nextLine());  
  17.   System.out.println("******************************");  
  18.   a.showStudent();  

 

运行试试:

Java代码 
  1. 请输入学生的姓名:   
  2. 张三  
  3. 请输入学生的年龄:   
  4. 21  
  5. 请输入学生所在城市:   
  6. 三里国  
  7. 请输入学生家所在的小区单元:   
  8. 常州市  
  9. 请输入邮政编码:   
  10. 222314  
  11. 请输入学生的出生日期:   
  12. 1989-02-02  
  13. ******************************  
  14. 该学生的信息为:  
  15. 姓名:张三  
  16. 年龄:21  
  17. 家庭住址:三里国常州市  
  18. 邮政编码:222314  
  19. 出生日期:1989-02-02  

 ok啦!!!

为什么加一个in.nextLine();就好了呢,原因是nextInt()读入的是仅是数字,而换行符没有读入,

使用nextInt()的时候,读取一定是数值型的字符,然后就按换行符 接着使用nextLine(),它是读到行分隔符就结束,而行分隔符前已经没信息,所以没有读到任何可返回的信息。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics