首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 字串索引越界:s1/s2 長度小於 s 導致 charAt 越界

     編輯:程式設計疑難解答

錯誤程式碼

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++;
    }
    // ...
}

根本原因

  1. 邏輯錯誤:s.indexOf(i) 以整數 i 為參數,會被視為字元碼點查找,回傳在 s 中首次出現的索引(0~31),而非 i 本身。
  2. 越界觸發:當 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、地區設定,避免手動範圍錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved