-1

所以我在程序中使用了這段代碼,每當我給出包含多個單詞的輸入時,編譯器就會多次執行catch塊。我也嘗試過不同的方法&直到現在所有的努力都是徒勞的。catch塊多次運行InputMismatchException

方法1:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (true) 
{ 
    try 
    { 
     size = scanner.nextInt(); 
     break; 
    } 
    catch (InputMismatchException e) 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
     continue; 
    } 
} 

方法2:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
boolean bError = true; 
while (bError) 
{ 
    if (scanner.hasNextInt()) 
     size = scanner.nextInt(); 
    else 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
     continue; 
    } 
    bError = false; 
} 

方法3:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (true) 
{ 
    if (scanner.hasNextInt()) 
    size = scanner.nextInt(); 
else 
{ 
    scanner.next(); 
    System.out.println("Enter valid input (Digit Only)"); 
continue; 
} 
String sizeStr = Integer.toString(size); 
Pattern pattern = Pattern.compile(new String ("^[0-9]*$")); 
Matcher matcher = pattern.matcher(sizeStr); 
if(matcher.matches()) 
{  
    break; 
} 
else 
{ 
    System.out.println("Enter valid input (Digit Only)"); 
    continue; 
} 
} 

方法4:

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (scanner.hasNext()) 
{ 
    if (scanner.hasNextInt()) 
    { 
     size = scanner.nextInt(); 
     System.out.println(size); 
     break; 
    } 
    else 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
    } 
} 

我現在可以通過接受一個字符串輸入並將其解析爲int來完成任務。但最初的疑問仍然是,爲什麼這不能正常工作。下面的代碼工作正常。

Scanner scanner = new Scanner(System.in); 
int size = 0; 
while (true) 
{ 
    try 
    { 
     String sizeStr = scanner.nextLine(); 
     size = Integer.parseInt(sizeStr); 
     break; 
    } 
    catch (NumberFormatException e) 
    { 
     System.out.println("Enter valid input (Digit Only)"); 
     scanner.next(); 
     continue; 
    } 
} 
+1

請正確格式化/縮進您的代碼。如果很難閱讀,很難提供幫助。 – nhouser9

+0

@ nhouser9 done :) – Jaideep

+0

對您有幫助嗎? http://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-nextint-or-other-nextfoo – nhouser9

回答

0

根據官方的Java文檔(https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html):

A Scanner breaks its input into tokens using a delimiter pattern, 
which by default matches whitespace. The resulting tokens may then be 
converted into values of different types using the various next 
methods. 

The scanner can also use delimiters other than whitespace. 

默認情況下,所有的下一個*()等掃描器類比nextLine的功能()讀取下一個標記,而不是下一個線。這意味着它讀取直到找到空白。如果您想要讀取一行中的所有標記,則需要使用nextLine(),然後根據需要顯式格式化輸入。

考慮此輸入:

abcd xyz 

當你scanner.nextInt()或任何scanner.next *()的比scanner.nextLine()等功能,只有 「ABCD」 被讀取,因爲它是下一個令牌。當您執行scanner.nextLine()時,將讀取當前行「abcd xyz」中的完整字符串,並且掃描器前進到下一行。

但是,如果您想讓nextInt()函數讀取整行,那麼您可以將分隔符設置爲新行'\ n'。

Scanner scan = new Scanner(System.in).useDelimiter("\n"); 

使用這個,你可以得到你想要的行爲。