2016-01-19 89 views
1


Java異常(java.util.InputMismatchException)

我定義的函數readInt()返回一個int(基於Scanner.nextInt())。

問題是:如果我輸入一個字符,我會得到這個異常:(java.util.InputMismatchException)。

我試圖用try-catch塊試圖解決它沒有成功。

怎麼了?

public static int readInt(String message, int min, int max) 
{ 
    displayBlack(message); 
    int number = scanner.nextInt(); 

    try{ 
     if (number < min || number > max) 
     { 
      return readInt("Erreur, Selectionner un nombre entre " + min + " et " + max, min, max); 
     } else 
     { 
      return number; 
     } 
    } 
    catch (NumberFormatException e){ 
      return readInt(message, min, max); 
    } 
} 



編輯:

我改變了我的功能:

public static int readInt(String message, int min, int max) 
{ 
    displayBlack(message); 

    try{ 
     String result = scanner.next(); 
     int number = Integer.parseInt(result); 

     if (number < min || number > max) 
     { 
      return readInt("Erreur, Selectionner un nombre entre " + min + " et " + max, min, max); 
     } else 
     { 
      return number; 
     } 
    } 
    catch (Exception e){ 
      return readInt("Erreur, Selectionner un nombre entre " + min + " et " + max, min, max); 
    } 
} 

現在,它的工作。這是一個好方法還是一個骯髒的黑客?

+1

你看過'hasNextInt'嗎?目前還不清楚你希望返回readInt(「Erreur,...」)做什麼...... –

+2

你也應該處理InputMismatchException –

+1

如果你用這種方式捕獲異常,你只會遞歸捕獲無限的異常,直到你會遇到堆棧溢出。至少,您需要更改輸入,以便對該方法的連續調用不會造成導致異常的完全相同的事情。 –

回答

1

我相信你誤解錯誤來自哪裏。你的try/catch看起來好像超出了界限錯誤(例如太大而不是int或太小),但是忽略了我認爲錯誤在哪裏的scanner.nextInt()。嘗試把它放在這樣的try/catch中,並用它來玩,直到獲得正確的結果。

displayBlack(message); 
try { 
    int number = scanner.nextInt(); 
} catch(Exception e) { //Just using this as a catch all - you might want to be more specific. 
    ... 
+2

相關:[爲什麼'catch(Exception)'幾乎總是一個壞主意?](https://stackoverflow.com/q/2416316) – Siguza

+0

雖然我當然同意你@Siguza,我用它作爲一個catch所有,因爲我不知道這個問題是如何處理每個問題的。事實上,我已經注意到了(發佈前7秒),他們應該更具體。 :) – Sh4d0wsPlyr

+0

我不是故意糾正你,我只是想提供任何人閱讀這些信息,爲什麼他們應該打擾。 :) – Siguza

-1

你得到InputMismatchException時,因爲你使用的掃描儀的nextInt()只當你是給人物接受整。如果你想接受字符串參數,那麼你必須嘗試next()或其他東西。希望它可以幫助你...

0

我修改了一下你的代碼。

public static Integer readInt(String message, int min, int max) 
{ 
    /*displayBlack(message);*/ 

    try { 
     /*String result = scanner.next();*/ 
     int number = Integer.parseInt(message); 

     if (number < min || number > max) { 
      System.out.println("Erreur, Selectionner un nombre entre " + min + " et " + max); 
      /*return readInt();*/ 
     } 
     return number; 
    } catch (InputMismatchException e) { 
     System.out.println("You must enter a number: " + e.toString()); 
     return null; 
    } catch (NumberFormatException e) { 
     System.out.println("You must enter a number: " + e.toString()); 
     return null; 
    } catch (Exception e) { 
     System.out.println("Another problem:" + e.toString()); 
     return null; 
    } 
} 

我使readInt返回一個整數(如果數字無效,可以爲null)。

我註釋掉了scanner.next語句,因爲您似乎正在通過消息傳遞它。

return語句只能返回在方法簽名中聲明的類型的對象。既然你把它聲明爲一個int,它只能返回一個int。我宣佈它是一個整數,所以它可以返回一個int或null。請注意,它不能像您一樣返回一個字符串。

我在最寬的Exception之前增加了兩個捕獲量,即InputMismatchExceptionNumberFormatException

我與這兩個語句測試了它:

Integer test = StackoverflowApplication.readInt("42", 0, 10); 
    Integer readMe = StackoverflowApplication.readInt("c", 0, 10); 

它返回針對第一42(同時打印出「ERREUR」消息)和用於第二空。我會拋出一個NumberFormatException異常。

相關問題