錯誤程式碼
String s = "AaaaABBBB/&^ccccHVGHkjhHJB16516351_JH"; // 長度 32
String s1 = "abcdefghijklmnopqrstuvwxyz"; // 長度 26
String s2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 長度 26
for (int i = 0; i < s.length(); i++) {
if (s1.charAt(s.indexOf(i)) != -1) { // 錯誤:indexOf 回傳索引,非字元
lCount++;
}
// ...
}
根本原因
- 邏輯錯誤:
s.indexOf(i) 以整數 i 為參數,會被視為字元碼點查找,回傳在 s 中首次出現的索引(0~31),而非 i 本身。
- 越界觸發:當
s.indexOf(i) 回傳值 ≥ 26 時,s1.charAt(>=26) 拋出 StringIndexOutOfBoundsException,因 s1 長度僅 26。
正確判斷字元類別的方法
方法一:Character 工具類(推薦)
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (Character.isLowerCase(ch)) lCount++;
else if (Character.isUpperCase(ch)) uCount++;
else oCount++;
}
方法二:ASCII 範圍比較
char ch = s.charAt(i);
if (ch >= 'a' && ch <= 'z') lCount++;
else if (ch >= 'A' && ch <= 'Z') uCount++;
else oCount++;
方法三:正則表達式
lCount = s.replaceAll("[^a-z]", "").length();
uCount = s.replaceAll("[^A-Z]", "").length();
oCount = s.length() - lCount - uCount;
關鍵點總結
String.indexOf(int ch) 參數是字元碼點,回傳在字串中的索引位置。
String.charAt(int index) 索引範圍 [0, length()-1],超出拋出異常。
- 字元分類優先使用
Character 類別,支援 Unicode、地區設定,避免手動範圍錯誤。