char の演算と文字コード
charは演算するとintに昇格します。'0'を引く定番テクニックの仕組みも解説します。
なぜエラーが出ないのか
出力: 98
(エラーなし)- javacは何も報告しません。文法として正しいためです
出力: 98- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 char c = 'a'; 4 System.out.println(c + 1 ); ^ 5 } 6 }
出力: 98期待: b (コンパイルは通っています)
charは演算するとintに昇格します。文字として出したければcharへ戻すキャストが要ります。
直し方: c + 1 を (char) (c + 1) にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 String s = "123"; 4 int d = s.charAt(0) ; ^ 5 System.out.println(d); 6 } 7 }
出力: 49期待: 1 (コンパイルは通っています)
文字'1'の数値は49です。'0'を引くと文字コードの差が取れて数値の1になります。
直し方: (空) を - '0' にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 String s = "java"; 4 for (int i = 0; i < s.length(); i++) { 5 System.out.print(s.get (i)); ^ 6 } 7 } 8 }
Main.java:5: error: cannot find symbol
symbol: method get(int)
1文字取り出すのはcharAt(i)です。Stringにはget(int)というメソッドはありません(Listのgetと混同しやすい箇所です)。
直し方: get を charAt にします。
よくある誤解
charは数値型です。'a' < 'b' が成り立つのは、文字コードを比較しているからです。
まとめ
char の演算と文字コードは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。