2013-01-18 68 views
0

好吧,夥計們,我試圖得到一個Java的基本掛鉤,我想我會做一些比平常更復雜。我在這個方法中的一個嘗試是首先檢查第一個字符是否可以是一個int,如果是,我想看看這個數字在輸入中有多遠(所以如果用戶輸入455 + 60,I '想要拔出455並停在+)。ArrayIndexOutOfBounds當測試一個字符,如果它是一個int

由於某種原因,如果輸入是500噸,它將正常工作。但是如果索引在數字之後結束(例如輸入僅爲500),那麼它就有問題。我在考慮for循環繼續出於某種原因。有人能告訴我我在哪裏搞砸了嗎?我添加了一條if語句,看看我能否阻止它,但無濟於事。

public void init(){ 
    int chars = 0; 
    /* 
    * Input fancy intro here. 
    */ 
    clearArray(); 
    String uInput = getInput(); 
    rawInput=uInput.toCharArray(); 
    cleanArray(rawInput); 
    try{Integer.parseInt(Character.toString(rawInput[0])); 
    boolean isNum = true; 
    for(int i=0;isNum==true;i++){ 
     if(i != rawInput.length){ 
     try{Integer.parseInt(Character.toString(rawInput[i]));} 
     catch (NumberFormatException s){ 
      isNum = false; 
      chars = i; 
      System.out.println("The number has: "+chars+" characters."); 
     } 
     } 
     }  
    } 
    catch (NumberFormatException s){ 
     System.out.println("What is this madness?"); 

    } 



} 

回答

1

在這裏,您避免要求rawInput[rawInput.length]

if(i != rawInput.length) 

...但你繼續下去,爲下一次迭代。

是否有任何理由,你不能只是做:

for (int i = 0; i < rawInput.length && isNum; i++) 

?我還建議使用Character.isDigit或自定義檢查,而不是將每個字符轉換爲字符串,然後解析並捕獲異常。

請注意Character.isDigit將返回true非ASCII數字,您可能不需要。你很可能只想要一個簡單的檢查:

char c = rawInput[i]; 
if (c < '0' || c > '9') { 
    isNum = false; 
} 

另外請注意,正則表達式可能是這更好的解決辦法...

哦,如果你有一個空字符串,那麼此時會計爲一個數字......

+0

好吧,謝謝。我確實必須將中間的for循環更改爲rawInput.length && isNum,不確定我們是否只使用該循環的不同版本。 – Signify

+0

@Signify:不,那只是一個錯字。 –

1

您可以通過在for循環中添加額外的檢查來查看您是否在字符串的末尾來解決此問題。嘗試:

for(int i=0;isNum==true && i<rawInput.length;i++){ 
0

你可以嘗試這樣的事情:

public int countDigits(String input) { 
    int digitsCount = 0; 

    for (int i = 0; i < input.length(); ++i) { 
     if (Character.isDigit(input.charAt(i))) { 
      ++digitsCount; 
     } else { 
      break; 
     } 
    } 

    return digitsCount; 
} 
相關問題