JAVA在使用我們經常使用的Scanner如下:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("請輸入a:");
int a=input.nextInt();
System.out.println("請輸入b:");
int b=input.nextInt();
System.out.println("a="+a);
System.out.println("b="+b);
}
}
我們一般想要的是先輸入b然後輸入a,但是如果此時我們第一次輸入a的時候出現了空格或者tab的時候,我們将沒有輸入b的機會。第一個nextInt();直接會将空格前一部分輸入内容掃描進a(此時next方法并沒有掃描到空格以後的值),當運作到第二個nextInt();時會先檢查Scanner的實列input緩存中有沒有内容,有内容的話将不會要求輸入。此時第二個next();掃描到了原來空格以後的值直接就拿來用了。

如圖此時b将直接被456指派。
還有以下代碼造成的死循環
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
boolean flag=true;
int a=0;
do {
try {
System.out.println("請輸入a:");
a=input.nextInt(); //先檢測input對象中是否有資料緩存,有的話就不用輸入,然後進行類型比對,此時如果是字元将無法掃描,報錯跳到 catch
} catch (Exception e) {
//catch捕捉到錯誤将flag指派false想要讓程式重新執行。
System.out.println("您輸入的不是數字!");
flag=false;
}
}while(!flag);
System.out.println("a="+a);
}
}
如果輸入的不是數字,将會造成循環,上課的時候老師說是Scanner緩存的問題,其實也确實是這樣。因為是菜鳥是以找了些資料,發現之是以造成死循環是因為如同代碼注釋所說當nextInt();發現Scanner執行個體input中不是整數的時候将無法掃描,然後有catch語句重新執行,再次到nextInt();掃描時因為之前的input中非整型緩存還沒有被掃描,是以不會提示使用者輸入,而是準備直接掃描,類型比對時又發現類型不比對,是以又重新回到catch循環。
因為弄清這個問題而了解到了Scanner運作機制,在此做個筆記。