import java.util.Scanner;public class SystemIn {    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();  // 读int
        double d = scanner.nextDouble();  // 读double
        String str = scanner.nextLine(); // 读一行        System.out.println( "i = " + i + " , d = " + d + " , str = "+ str);
        scanner.close();
        
    }}
输入“1244 1244.0 eclipse”后,输出为“i = 1244 , d = 1244.0 , str =  eclipse”
若输入“1244”,回车,“1244.0”,回车,结果就数了出来。输出为“i = 1244 , d = 1244.0 , str = ”public int nextInt()    将输入信息的下一个标记扫描为一个 int。
public String nextLine()     此扫描器执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。 何解?

解决方案 »

  1.   


      有些书上明确指出nextLine方法用在nextInt,nextDouble方法后要重新创建新的Scanner对象
      具体为什么我也不清楚
      

  2.   

    没错,public String nextLine() 此扫描器执行当前行,并返回跳过的输入信息。
    你改用next()就可以了。
      

  3.   

    用next()解决问题..  一般很少用nextLine()
      

  4.   

    next()只能接收一个字符串,不能读一行!
      

  5.   

    是不是和C语言里那个经典问题一样:回车符是“回车+换行”,你的nextLine()读到的是一个回车。
    我手边不方便,你可以试一试在scanner.close();前加上一句System.out.println("test");看看“i = 1244 , d = 1244.0 , str = ”和“test”之间是不是空了两行。
      

  6.   

    在读一行之前跳过所有的空白即可:
    Scanner scanner = new Scanner(System.in);
    int i = scanner.nextInt();  // 读int
    double d = scanner.nextDouble();  // 读double
    scanner.skip("\\W*");  // 跳过空白
    String str = scanner.nextLine(); // 读一行System.out.println( "i = " + i + " , d = " + d + " , str = "+ str);
    scanner.close();
      

  7.   

    在默认的情况下(可用特定正则表达式指定),Scanner是根据空白字符输入进行分词。
    Scanner先要进行分词,然后才开始匹配一下分词是否符合正则表达式(用hasNext(pattern))。
    此输入中转换成字符串为:
    str="1244\n"+"1244.0\n”+"\n"
    经过分隔后:1244,1244.0,空
    所以,结果就是那样了。
      

  8.   


    分隔后结果是“1244,1244.0,空”,但str="1244\n"+"1244.0\n”+"\n"最后一个"\n"是怎么来的?6楼的方法可以实现要求,但是“scanner.skip("\\W*");  // 跳过空白 ”,跳过了些什么?当我们按下回车的时候,标准输入端输入的是什么?