char と String のクォートの違い
シングルクォートとダブルクォートは互換性がありません。エスケープの書き方も合わせて扱います。
エラーメッセージの読み方
Main.java:3: error: incompatible types: String cannot be converted to char
Main.java- ファイル名
3- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
incompatible types: String cannot be converted to char- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 char c = "A"; ^ 4 System.out.println(c); 5 } 6 }
Main.java:3: error: incompatible types: String cannot be converted to char
charはシングルクォート、Stringはダブルクォートです。Javaではこの2つに互換性がありません。
直し方: "A" を 'A' にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 String s = 'hello'; ^ 4 System.out.println(s); 5 } 6 }
Main.java:3: error: unclosed character literal
シングルクォートは1文字専用です。2文字以上を囲むと文字リテラルとして閉じられないと判断されます。
直し方: 'hello' を "hello" にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 System.out.println("He said " hi\""); ^ 4 } 5 }
Main.java:3: error: ')' expected
文字列の中でダブルクォートを使うにはバックスラッシュでエスケープします。そのまま書くと文字列がそこで終わります。
直し方: " を \" にします。
パターン4
1 public class Main { 2 public static void main(String[] args) { 3 char[] letters = "abc" ; ^ 4 System.out.println(letters[0]); 5 } 6 }
Main.java:3: error: incompatible types: String cannot be converted to char[]
文字列とchar配列は別の型です。1文字ずつのchar初期化子として書く必要があります。
直し方: "abc" を {'a', 'b', 'c'} にします。
パターン5
1 public class Main { 2 public static void main(String[] args) { 3 char c = '' ; ^ 4 System.out.println(c); 5 } 6 }
Main.java:3: error: empty character literal
シングルクォートは必ず1文字を挟みます。中身が無いと空の文字リテラルとしてエラーになります。
直し方: '' を ' ' にします。
よくある誤解
他言語ではクォートの種類を区別しないものが多く、その癖がそのまま事故になります。Javaでは互換性がありません。
まとめ
char と String のクォートの違いは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。