這裡討論的是關於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」的影響了。