HOWTO · Java
Java で空の文字を表す
この記事では、Java で空の char を処理する方法を紹介します。
このページの内容
Javaには、値のないプリミティブ型 char はありません。char が保持するのはUTF-16コード単位1つです。文字リテラル '' は文字を含まないため無効です。空の char[] は作れますが、これは要素数0の配列であり、char の値ではありません。テキストがないことを表すには空の String を使い、文字値が必要なら空白やU+0000など、実際の文字を選びます。
'' が無効で、空白とは異なる理由
char リテラルは単一引用符で囲み、文字を1つ含めます。式 char ch = ''; はコンパイルできません。一方、' ' は空白を含む有効な char です。次の短いプログラムでは、角括弧で空白を見えるようにし、その数値も表示します。
public class CharExample {
public static void main(String[] args) {
char space = ' ';
System.out.println("[" + space + "]");
System.out.println((int) space);
}
}
[ ]
32
角括弧で空白とその前後のテキストを区別でき、整数値で文字の値を確認できます。空白も比較や文字列操作では文字として存在します。意図したデータが空白である場合にだけ使ってください。
文字がない場合は空の String を使う
データがテキストなしを表す場合は、String value = ""; とします。空の String の長さは0で、テキストフィールドや文字列の連結、文字列を受け取るAPIに適しています。これは char ではないため、Javaでは "" をプリミティブ型 char の変数に代入できません。空の char[] も作れますが、これは文字が1つ欠けている状態ではなく、要素のない並びを表します。
null文字には \0 または \u0000 を使う
JavaではU+0000を \0 または \u0000 と記述でき、どちらも同じ実際の char 値を表します。U+0000はnull文字と呼ばれることもありますが、空の文字ではなく、通常Javaの String を終端しません。表示すると何も見えないように見えることがあるため、値を確認するには数値を調べてください。U+0000はコード単位を1つ占め、Java文字列の length() にも数えられます。
public class NullCharacterExample {
public static void main(String[] args) {
char shortEscape = '\0';
char unicodeEscape = '\u0000';
String value = "A" + shortEscape + "B";
System.out.println(shortEscape == unicodeEscape);
System.out.println((int) shortEscape);
System.out.println(value.length());
}
}
true
0
3
このコードでは2種類の表記を比較し、U+0000を整数に変換して、できた文字列の長さを測定します。端末での表示に頼らず値を確認できます。文字列には A、U+0000、B が含まれるため、長さは3です。
Character.MIN_VALUE または Character と null を使う
次の実行可能な例では、文字をラッパーで扱い、その値と値が存在するかどうかを表示します。
public class CharacterExample {
public static void main(String[] args) {
Character value = Character.valueOf('J');
System.out.println(value);
System.out.println(value == null);
}
}
J
false
Character.MIN_VALUE はU+0000を得るための名前付き定数であり、別の空値ではありません。データ形式でその文字自体が必要な場合に使います。値が存在しないことを表すには、Character ラッパーに null を格納できます。これは char ではなく参照がない状態なので、アンボックスしたりメソッドを呼び出したりする前に、コードで確認する必要があります。
Javaでは、char 型のインスタンスフィールドはU+0000で初期化されます。ローカル変数の char には自動的な初期値がないため、読み取る前に代入しなければなりません。テキストがない場合は String、任意の文字を表す場合は null を使える Character、U+0000自体に意味がある場合に限って \0 を選びます。