`
bianku
  • 浏览: 69669 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

Scanner的用法误区

    博客分类:
  • Java
 
阅读更多

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

Student a=new Student();
		Scanner in = new Scanner(System.in);
		System.out.println("请输入学生的姓名: ");				
		a.setName(in.nextLine());
		System.out.println("请输入学生的年龄: ");
		a.setAge(in.nextInt());
		System.out.println("请输入学生所在城市: ");
		a.setCity(in.nextLine());
		System.out.println("请输入学生家所在的小区单元: ");
		a.setAddr(in.nextLine());
		System.out.println("请输入邮政编码: ");
		a.setPostcode(in.nextInt());
		System.out.println("请输入学生的出生日期: ");
		a.setDate(in.nextLine());
		System.out.println("******************************");
		a.showStudent();

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

“请输入学生所在城市:

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

这样:

请输入学生的姓名: 
张三
请输入学生的年龄: 
21
请输入学生所在城市: 
请输入学生家所在的小区单元: 
常州
请输入邮政编码: 
222314
请输入学生的出生日期: 
******************************
该学生的信息为:
姓名:张三
年龄:21
家庭住址:常州
邮政编码:222314
出生日期:

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

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

分隔符被nextLine()接受了?

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

int n =in.nextInt() ;
String s1 = in.nextLine(); 
String s2 = in.nextLine(); 
输入:
12 
I LOVE YOU
LOVE YOU

 

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

12

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

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

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

Student a=new Student();
  Scanner in = new Scanner(System.in);
  System.out.println("请输入学生的姓名: ");    
  a.setName(in.nextLine());
  System.out.println("请输入学生的年龄: ");
  a.setAge(in.nextInt());
     in.nextLine();//加在这!!
  System.out.println("请输入学生所在城市: ");
  a.setCity(in.nextLine());
  System.out.println("请输入学生家所在的小区单元: ");
  a.setAddr(in.nextLine());
  System.out.println("请输入邮政编码: ");
  a.setPostcode(in.nextInt());
  in.nextLine();//还有这!!!
  System.out.println("请输入学生的出生日期: ");
  a.setDate(in.nextLine());
  System.out.println("******************************");
  a.showStudent();

 

运行试试:

请输入学生的姓名: 
张三
请输入学生的年龄: 
21
请输入学生所在城市: 
三里国
请输入学生家所在的小区单元: 
常州市
请输入邮政编码: 
222314
请输入学生的出生日期: 
1989-02-02
******************************
该学生的信息为:
姓名:张三
年龄:21
家庭住址:三里国常州市
邮政编码:222314
出生日期:1989-02-02

 ok啦!!!

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

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


恍然大悟啊,原来如此。

总结一下:

1、首先遇到问题要勤于思考,不用畏惧

2、可以联想以前的问题,有没有遇过相似的情况可以借鉴的

申明:

1、本文的层次比较低,如果您不小心看了,浪费您时间了请您谅解

2、时间仓促+技术不行,错误在所难免,感谢指出

 

分享到:
评论
2 楼 yx1989 2011-08-14  
不错,讲解得很清楚
1 楼 bianku 2009-06-01  

相关推荐

Global site tag (gtag.js) - Google Analytics