2016-12-13 74 views
0

我試圖解決編碼蝙蝠的問題並且無法通過一項測試。StringIndexOutOfBoundsException檢查單詞的最後一個字母時爲-1

給定一個字符串,計算以'y'或'z'結尾的單詞數 - 所以'heavy'中的'y'和'fez'中的'z'數,而不是'y'在「黃色」(不區分大小寫)。如果緊跟在字母后面沒有字母,我們會說y或z在單詞的末尾。 (注:Character.isLetter(char)的測試,如果一個字符是字母文字。)

這裏是我的代碼:

public int countYZ(String str) { 
int count = 0; 
str = str.toLowerCase(); 
String[] newArr = str.split("[\\s:0-9-!]+"); 
for (String word : newArr) { 
    if (word.charAt(word.length() - 1) == 'y' || 
    word.charAt(word.length() - 1) == 'z') { 
    count++; 
    } 
    } 
    return count; 
} 

但是我無法通過這個測試,它顯示了這個錯誤:

countYZ( 「!!日 - YAZ !!」)→2

Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)

+2

顯然一個數組中的字符串是空的。 – Eran

+0

@Eran是正確的。一個簡單的解決方法是使用'word.endsWith(「y」)|| word.endsWith( 「Z」)'。這也適用於空字符串(如預期的那樣產生錯誤)。 –

回答

1

Exception:java.lang.StringIndexOutOfBoundsException: String index out of range: -1 (line number:6)意味着你打電話第3210指數。

你打電話總是charAt(word.length()-1)所以如果word.length()-1 == -1,word.length() == 0。在檢查最後一封信前檢查是否加入word.length()>0

它由以下切片造成的:

!!day--yaz!! 
["day", "yaz", ""] 

例如,你可以這樣寫:

for (String word : newArr) { 
    if (word.length() > 0 && (word.charAt(word.length() - 1) == 'y' || 
    word.charAt(word.length() - 1) == 'z')) { 
    count++; 
    } 
    } 
    return count; 
} 

或簡單(根據Ole的想法):

for (String word : newArr) { 
    if (word.endsWith("y") || word.endsWith("z")) { 
    count++; 
    } 
    } 
    return count; 
} 
相關問題