网站首页 > 网络编程教程 > Java教程 > Java Scanner类中的next方法和nextLine方法连用时要注意的地方

Java Scanner类中的next方法和nextLine方法连用时要注意的地方

  • 作者:互联网
  • 时间:2009-12-08 17:22:22

这里讨论的是关于java scanner类中的next方法和nextLine方法。     什么是next()和nextLine()方法?

   问题出现:

   先看以下代码:   一个简单的控制台输入和输出:

   view plaincopy to clipboardprint?
package cn***leader.app.vi;  
import ja***util.Scanner;  
public class Test {  
    public static void main(String[] args) throws Exception{  
        Scanner cin = new Scanner(Sy***m.in);  
        String  ni = ci***extLine();  
            Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
        ni = ci***extLine();  
        Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
    }  

package cn***leader.app.vi;
import ja***util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(Sy***m.in);
        String  ni = ci***extLine();
Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
    ni = ci***extLine();
    Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
}
}


   再看下面的代码:

   view plaincopy to clipboardprint?
package cn***leader.app.vi;  
import ja***util.Scanner;  
public class Test {  
    public static void main(String[] args) throws Exception{  
        Scanner cin = new Scanner(Sy***m.in);  
        String  ni = cin.next();  
            Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
        ni = cin.next();  
        Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
    }  

package cn***leader.app.vi;
import ja***util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(Sy***m.in);
        String  ni = cin.next();
Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
    ni = cin.next();
    Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
}
}

   以上段代码都是正确、无聊的。

      精彩的来了……

    运行下面的代码:

    view plaincopy to clipboardprint?
package cn***leader.app.vi;  
import ja***util.Scanner;  
public class Test {  
    public static void main(String[] args) throws Exception{  
        Scanner cin = new Scanner(Sy***m.in);  
        String  ni = cin.next();  
            Sy***m.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
        ni = ci***extLine();  
        Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
    }  
}  
package cn***leader.app.vi;
import ja***util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(Sy***m.in);
        String  ni = cin.next();
Sy***m.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
    ni = ci***extLine();
    Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());

}

    运行结果如下:

    ni掌柜
    用Scanner类的next()方法接收了你刚刚输入的字符串是:ni掌柜  长度是4
    用Scanner类的next()方法接收了你刚刚输入的字符串是:  长度是0

    完蛋了,当 Java Scanner的next和nextLine方法连用时,


    你根本没有机会输入第二个字符串了!!!

    问题解析:

       next方法和nextLine方法的表象区别是前者读取的是“一段”字符,而后者读取的是一行字符串。

       出现以上现象的原因简单的说主要是由next()方法的不负责造成的。

       next()方法的工作原理:( 肤浅的说)

       从一行中扫描,直到碰到特定的标识符:空格或是换行符(n),获取其前的字符(串)。

        看这里,第一个next()方法读入了“ni掌柜”,但并没有读入"n",也不负责换行,然后就把 "n"丢给了nextLine()处理,

        你也知道的,nextLine()属于那种“见钱眼开”,看见“n”就收了,然后扫描了 n 之前的内容,也就是空字符串。于是出现问题了。

        问题解决:

         view plaincopy to clipboardprint?
package cn***leader.app.vi;  
import ja***util.Scanner;  
public class Test {  
    public static void main(String[] args) throws Exception{  
        Scanner cin = new Scanner(Sy***m.in);  
        String  ni = cin.next();  
            Sy***m.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
        while(  (ni = ci***extLine()).equals("") ){}  
        Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());  
    }  
}  
package cn***leader.app.vi;
import ja***util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(Sy***m.in);
        String  ni = cin.next();
Sy***m.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
    while(  (ni = ci***extLine()).equals("") ){}
    Sy***m.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+"  长度是"+ni***ngth());
}

         运行结果:

        ni掌柜
        用Scanner类的next()方法接收了你刚刚输入的字符串是:ni掌柜  长度是4
        是个天才
        用Scanner类的next()方法接收了你刚刚输入的字符串是:是个天才  长度是4

        把原来的第二个ci***extLine()

        改成 while(  (ni = ci***extLine()).equals("") ){}

        这样就可以、除掉上一行的“n”的影响了。