这里讨论的是关于java scanner类中的next方法和nextLine方法。 什么是next()和nextLine()方法?
问题出现:
先看以下代码: 一个简单的控制台输入和输出:
view plaincopy to clipboardprint?
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.nextLine();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
ni = cin.nextLine();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.nextLine();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
ni = cin.nextLine();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
再看下面的代码:
view plaincopy to clipboardprint?
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.next();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
ni = cin.next();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.next();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
ni = cin.next();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
以上段代码都是正确、无聊的。
精彩的来了……
运行下面的代码:
view plaincopy to clipboardprint?
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.next();
System.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
ni = cin.nextLine();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.next();
System.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
ni = cin.nextLine();
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
运行结果如下:
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.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.next();
System.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
while( (ni = cin.nextLine()).equals("") ){}
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
package cn.nileader.app.vi;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
String ni = cin.next();
System.out.println("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
while( (ni = cin.nextLine()).equals("") ){}
System.out.print("用Scanner类的next()方法接收了你刚刚输入的字符串是:"+ni+" 长度是"+ni.length());
}
}
运行结果:
ni掌柜
用Scanner类的next()方法接收了你刚刚输入的字符串是:ni掌柜 长度是4
是个天才
用Scanner类的next()方法接收了你刚刚输入的字符串是:是个天才 长度是4
把原来的第二个cin.nextLine()
改成 while( (ni = cin.nextLine()).equals("") ){}
这样就可以、除掉上一行的“n”的影响了。