Java 中的 Integer.parseInt(scanner.nextLine()) 和 scanner.nextInt()
一、概述
在 Java 中,我們可以同時使用Integer.parseInt(Scanner.nextLine())
和Scanner.nextInt()
從Scanner
讀取整數。但是,這兩種方法之間存在一些差異。
在本教程中,我們將比較它們並討論它們的差異。
2. 使用Integer.parseInt(scanner.nextLine())
和scanner.nextInt()
讀取整數
Scanner.nextLine()
方法從掃描器中將整行作為字符串讀取。所以,如果我們想要結果是一個Integer
,我們必須自己將字符串轉換成Integer
,例如,使用Integer.parseInt()
方法。
另一方面, Scanner.nextInt()
將輸入的下一個標記讀取為整數。 Scanner
中的標記由Scanner
用來解析輸入流的定界符模式定義。默認情況下, Scanner
的分隔符模式是任何空白字符(例如空格、製表符或換行符)。
現在我們了解了這些方法的作用。讓我們看看他們如何從Scanner
對像中讀取整數。首先,我們將向掃描儀提供一個帶有尾隨換行符的字符串:
String input = "42\n";
為簡單起見,我們將使用單元測試斷言來驗證本教程中的結果。
首先,讓我們使用Scanner.nextLine()
方法獲取數字 42:
Scanner sc1 = new Scanner(input);
int num1 = Integer.parseInt(sc1.nextLine());
assertEquals(42, num1);
接下來,輪到Scanner.nextInt()
了:
Scanner sc2 = new Scanner(input);
int num2 = sc2.nextInt();
assertEquals(42, num2);
如上面的兩個測試所示,兩種方法都可以從Scanner
對象讀取輸入並正確獲取整數 42。
接下來,讓我們看看這兩種方法之間的區別。
3. 當輸入的數字格式無效時
它們的第一個區別是當輸入不是有效數字時,這兩種方法會拋出不同的異常。
現在,讓我們更改輸入:
String input = "Nan\n";
當我們通過scanner.nextLine()
讀取輸入並嘗試將無效輸入轉換為整數時,它會拋出**NumberFormatException** :
Scanner sc1 = new Scanner(input);
assertThrows(NumberFormatException.class, () -> Integer.parseInt(sc1.nextLine()));
這是因為sc1.nextLine()
將下一個輸入行作為字符串讀取。但是,後來的轉換失敗了。因此, NumberFormatException
由Integer.parseInt()
方法拋出。
值得一提的是,我們使用了 JUnit 5 的assertThrows()
方法來斷言方法調用拋出NumberFormatException.
另一方面,當我們嘗試使用Scanner.nextInt()
將輸入讀取為整數時,它會引發InputMismatchException
:
Scanner sc2 = new Scanner(input);
assertThrows(InputMismatchException.class, sc2::nextInt);
4. Scanner.nextInt()
方法不會消耗無效的令牌
正如我們之前提到的, Scanner.nextLine()
從輸入中讀取下一行作為字符串。與Scanner.nextLine()
方法不同, nextInt()
將嘗試將輸入中的下一個標記解析為整數。
如果它無法解析令牌,正如我們之前看到的, nextInt()
會拋出InputMismatchException
。但我們應該注意Scanner.nextInt()
不會消耗解析失敗的令牌。
一個例子可以幫助我們快速理解這一點:
String input = "42 is a magic number\n";
// nextInt()
Scanner sc2 = new Scanner(input);
int num2 = sc2.nextInt();
assertEquals(42, num2);
// calling nextInt() again on "is" raises the exception
assertThrows(InputMismatchException.class, sc2::nextInt);
String theNextToken = sc2.next();
assertEquals("is", theNextToken);
如上例所示,輸入字符串有五個標記。第一個,“ 42
”是一個有效的整數。正如我們所料, sc2.nextInt()
調用得到了整數42.
然後,我們再次調用nextInt()
並嘗試將標記“ is
”解析為整數。它拋出InputMismatchException
,這也是我們的期望。
接下來,我們調用sc2.next()
來獲取字符串形式的下一個標記。我們可以看到,從輸入中讀取了nextInt()
方法剛才解析失敗的標記“ is
”。換句話說, sc2.nextInt()
方法不使用“ is
”。
5.換行處理
Java Scanner 默認在輸入中用“ \n
”字符分隔行。那麼接下來,讓我們看看Scanner.nextLine()
和nextInt()
是如何處理換行符的。
我們先準備一個多行字符串作為輸入:
String input = new StringBuilder().append("42\n")
.append("It is a magic number.\n")
.toString();
Scanner.nextLine()
方法使用整行,包括行分隔符。但是,它只返回末尾沒有換行符的文本,然後將位置設置為下一行的開頭:
// nextLine()
Scanner sc1 = new Scanner(input);
int num1 = Integer.parseInt(sc1.nextLine());
String nextLineText1 = sc1.nextLine();
assertEquals(42, num1);
assertEquals("It is a magic number.", nextLineText1);
但是,另一方面, Scanner.nextInt()
將輸入的下一個標記掃描為整數,而不消耗其後的換行符:
// nextInt()
Scanner sc2 = new Scanner(input);
int num2 = sc2.nextInt();
assertEquals(42, num2);
// nextInt() leaves the newline charater (\n) behind
String nextLineText2 = sc2.nextLine();
assertEquals("", nextLineText2);
在這個測試中,在我們通過調用sc2.nextInt()
得到數字 42 之後,我們調用了sc2.nextLine()
。然後,正如我們所見,該方法返回一個空字符串而不是“ It is a magic number.
“。這是因為nextInt()
不使用“ 42
”之後的換行符。
六,結論
在本文中,我們通過示例討論了Integer.parseInt(Scanner.nextLine())
和Scanner.nextInt()
之間的區別。讓我們在這裡看一個簡短的摘要:
- 對於無效數字格式的輸入,這兩種方法會拋出不同的異常。
-
Scanner.nextLine()
在Scanner,
但返回沒有換行符的字符串。 -
Scanner.nextInt()
不使用換行符。 -
Scanner.nextInt()
不會使用它無法解析的令牌。
與往常一樣,此處提供的所有代碼片段都可以在 GitHub 上找到。