Java Scanner类中的next方法和nextLine方法连用时要注意的地方
2009-12-08 21:06:37 来源:WEB开发网核心提示:这里讨论的是关于java scanner类中的next方法和nextLine方法, 什么是next()和nextLine()方法? 问题出现: 先看以下代码: 一个简单的控制台输入和输出: view plaincopy to clipboardPRint?package cn.nileader.app.vi; im
这里讨论的是关于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”的影响了。
问题出现:
先看以下代码: 一个简单的控制台输入和输出:
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”的影响了。
更多精彩
赞助商链接