Scanner對象及其獲取數據出現小問題和解決方案

Scanner類簡介:java

  Java 5添加了java.util.Scanner類,咱們能夠經過Scanner類來獲取用戶輸入。它是之前的StringTokenizer和Matcher類之間的某種結合。因爲任何數據都必須經過同一模式的捕獲組檢索或經過使用一個索引來檢索文本的各個部分。因而能夠結合使用正則表達式和從輸入流中檢索特定類型數據項的方法。這樣,除了能使用正則表達式以外,Scanner類還能夠任意地對字符串和基本類型(如int和double)的數據進行分析。藉助於Scanner,能夠針對任何要處理的文本內容編寫自定義的語法分析器。正則表達式

基本語法:spa

 1 import java.util.Scanner;
 2 public class ScannerDemo {
 3     public static void main(String[] args) {
 4         Scanner scan = new Scanner(System.in);
 5             // 從鍵盤接收數據
 6             // nextInt方式接收字符串
 7         System.out.println("nextInt方式接收:");
 8         // 判斷是否還有輸入
 9         if (scan.hasNextInt()) {
10             int i = scan.nextInt();
11             System.out.println("輸入的數據爲:" + i);
12         }
13         scan.close();
14     }
15 }
16 // 假如用戶輸入數據爲:10,那麼該程序結果爲:
17 // 輸入的數據爲:10

部分API方法:code

其實上圖的意思就是,好比:nextlnt():只讀取int值,就是隻能讀取整數類型的數據,若是輸入了非整型的數據(浮點型字符串等)就會報錯。nextFloat()、nextDouble()這些也是以此類推,只能讀取符合該類型的數據。對象

 經常使用三個方法區別(next()、nextLine()、nextInt()):blog

  ①nextInt()只讀取數值,讀取完後\n沒有讀取而且光標放在本行索引

                Scanner sc=new Scanner(System.in);內存

                int i=sc.nextInt();資源

  ②next()方法遇到第一個掃描有效字符,即第一個非空格非換行符後面開始,一直獲取到下一個空格,換行符以前的,單個字符串字符串

                Scanner sc=new Scanner(System.in);

                int i=sc.next();

  ③nextLine()能夠掃描到一行內容並做爲一個字符串而被獲取到

                Scanner sc=new Scanner(System.in);

                int=sc.nextLine();
使用nextInt()、nextLine()出現的小問題及解決方法:

當Scanner對象同時使用nextInt()和nextLine()方法時,會出現nextLine()沒有任何輸出內容,以下代碼:

 1 import java.util.Scanner;
 2 public class ScannerText{
 3    public static void main(String[] args){
 4       Scanner sc = new Scanner(System.in);
 5       System.out.println("請輸入數字");
 6       // 接收輸入的數字
 7       int number = sc.nextInt();
 8       System.out.println("請輸入字符串");
 9       // 接收輸入的字符串
10       String str = sc.nextLine();
11       System.out.println("number:"+number+", str:"+str);
12    }      
13 }  

結果:

請輸入數字
10
請輸入字符串
number:10, srt:
// 能夠發現,當咱們剛按照提示輸入數字並回車時(我輸入的是10並回車),代碼直接執行到最後並結束了,這是爲何呢?

 由於:

  nextInt():是鍵盤錄入整數的方法,當咱們錄入10 並回車的時候,其實在鍵盤上錄入的是10和\r\n,nextInt()方法只獲取到10就結束了

  nextLine():是鍵盤錄入字符串的方法,能夠接受任意類型,可是他憑什麼能獲取一行呢?是經過\r\n,只要遇到\r\n就證實一行結束

因此:

  在上述代碼示例操做中,當咱們輸入10並回車的時候,nextInt()在咱們輸入10的時候就結束錄入,而剩下的\r\n正好遇到nerxtLine()方法,而且仍是該方法的結束證實,因此,咱們還沒按照提示輸入字符串程序就已經結束;

解決方案一:

在輸入第二次字符串的時候,在new一個Scanner對象(可是這種比較消耗內存資源,不推薦)

 1 import java.util.Scanner;
 2 public class ScannerText{
 3    public static void main(String[] args){
 4       Scanner sc1 = new Scanner(System.in);
 5       System.out.println("請輸入數字");
 6       // 接收輸入的數字
 7       int number = sc1.nextInt();
 8       System.out.println("請輸入字符串");
 9       // 在輸入第二次字符串的時候,再new一個scanner對象
10       Scanner sc2 = new Scanner(System.in);
11       // 接收輸入的字符串
12       String str = sc2.nextLine();
13       System.out.println("number:"+number+", str:"+str);
14    }      
15 }  

 解決方案二:

無論是數字仍是字符串,都統一用nextLine()方法接收,接收以後在將結果進行處理,若是須要是int數據,將其結果轉成int就ok

 1 import java.util.Scanner;
 2 public class ScannerText{
 3     public static void main(String[] args){
 4         Scanner scanner = new Scanner(System.in);
 5         System.out.println("請輸入數字");
 6         // 用String類型接收輸入的數字
 7         String str1 = scanner.nextLine();
 8         // 將String類型轉換成int/Integer類型
 9         int i = Integer.valueOf(str1);
10         // 查看數據類型
11         System.out.println("數據類型是:"+Integer.valueOf(str1).TYPE);
12     }
13 }  

 結果:

1 請輸入數字
2 10
3 數據類型是:int
相關文章
相關標籤/搜索