当前位置: 代码迷 >> J2SE >> JAVA控制台输入有关问题
  详细解决方案

JAVA控制台输入有关问题

热度:126   发布时间:2016-04-23 20:13:44.0
JAVA控制台输入问题
import java.util.Scanner;
public class TextInput {
      public static void main(String[]agrs){
       Scanner scan =new Scanner(System.in);
       System.out.println("输入名字:");
       String name =scan.nextLine();

       System.out.println("输入年龄:");
       int age =scan.nextInt();
       
       System.out.println("输入身高:");
       double stature =scan.nextDouble();
       
       System.out.println(""+age+""+ stature+""+ name);
      }
}
这个程序中 如果把   输入名字     放到 年龄或身高后面程序就会出问题:输入完年龄 身高后不等输入name就直接执行了最后的输入
------解决思路----------------------
查了一下 next   nextLine连用 说是next只读取了   换行符 的前面的内容但是没有读取换行符  当你调用nextLine的时候他会去读取当前行由于next丢下了个换行符 刚好nextLine是以换行符作标志 读取它前面的内容  而前面的内容被next拿走了 现在没有值了所以为空  也不会去等控制台输东西   我想其他的next*累死next方法 解决方法,添加:
              while((name=scan.nextLine()).equals("")){    
     }


追问:这个原因应该是nextLine先去读取缓存中的东西导致这个问题,但是我去看源码时 nextLine中会去调用clearCaches();这个方法不是清他的缓存吗?既然清了为什么还能读取到?
------解决思路----------------------
原因同楼上。因为nextInt读取的是换行符之前的Int类型的数据,nextline读取的是从焦点处到下一个换行符之前的内容,并将焦点移至下一个换行符之后。
public static void main(String[] agrs) {
Scanner scan = new Scanner(System.in);

System.out.println("输入年龄:");
int age = scan.nextInt();

System.out.println("输入身高:");
double stature = scan.nextDouble();

System.out.println("输入名字:");
String name = scan.nextLine();
name = scan.nextLine();

System.out.println("" + age + "   " + stature + "   " + name);
}
代码这样处理就没有问题了。
结合不同方法从键盘读取数据的时候,有时候不得不增加额外的nextline开销,以去掉换行符的影响
  相关解决方案