charAt(0) 比較失效:字元 '1' ≠ 數值 1 (ASCII 49)String aa = "11111";
if (aa.charAt(0) != 1) { // 錯誤:比較 char 與 int 數值 1
System.out.println("第一個數不為 1");
}
輸出:「第一個數不為 1」——**即使輸入以 '1' 開頭也會進入 if**。
aa.charAt(0) 回傳 char 型別,值為 '1',其 **Unicode/ASCII 碼為 49 (0x31)**。1 是 int 數值常量,值為 1。char 提升為 int 進行比較:**49 != 1 為真**,故進入 if 區塊。if (aa.charAt(0) != '1') { ... }
if (aa.charAt(0) != 49) { ... } // '1' == 49
if (!aa.startsWith("1")) { ... }
// 或
if (!"1".equals(aa.substring(0, 1))) { ... }
| 字元 | ASCII/Unicode 十進位 | 十六進位 |
|---|---|---|
'0' | 48 | 0x30 |
'1' | 49 | 0x31 |
'9' | 57 | 0x39 |
'A' | 65 | 0x41 |
'a' | 97 | 0x61 |
'\n' | 10 | 0x0A |
'\t' | 9 | 0x09 |
' ' | 32 | 0x20 |
「字元字面量用單引號
'x',字串用雙引號\"x\",數值直接寫數字。比較字元內容永遠用'x',別用數值。」
char c = '1'; ✅char c = 49; ⚠️ 可讀性差,維護時易誤改。if (c == 1) ❌ 錯誤,應 if (c == '1')。if (c == "1") ❌ 編譯錯誤:char 不能與 String 比較。總結: charAt(0) 回傳 char,比較時**必須用字元字面量 '1'**,不能用數值 1。這是 Java 新手最常見的「字元 vs 數值」混淆 Bug。