Java でのnullの意味を理解するために、数字との類似性を見てみましょう。数字の 0 は何かが存在しないことを表し、参照データ型に関してはnull は同じことを意味します。参照型 ( String、Object、StringBuilderなど) のフィールドに明示的に値が割り当てられていない場合は、プリミティブ型と同様にデフォルト値を受け取り、その値はnullになります。
コード | コンソール出力 |
---|---|
|
0
ヌル |
しかし、次のように配列を宣言すると:
String[] strings = new String[12];
12 個の要素を含む配列が作成され、そのすべてがnullになります。
コード | コンソール出力 |
---|---|
|
要素 0: null
要素 1: null 要素 2: null 要素 3: null 要素 4: null 要素 5: null 要素 6: null 要素 7: null 要素 8: null 要素 9: null 要素 10: null 要素 11: null |
ご覧のとおり、文字列と連結すると、値nullは文字列「null」になります。つまり、次のようにtoString()メソッドを呼び出すとします。
String[] strings = null;
System.out.println(strings.toString());
その場合、 NullPointerExceptionが発生します(例外については後で詳しく説明します)。nullに対して他のメソッドを呼び出そうとした場合も、同じことが起こります(例外は静的メソッドであり、これについてはすぐに説明します)。
public static void main(String[] args) {
StringBuilder sb = null;
sb.append("test"); // This will compile, but there will be a runtime error
}
nullは特に予約済みキーワード ( publicやstaticなど) であるため、 nullという名前の変数、メソッド、またはクラスを作成することはできません。他のキーワードと同様、このキーワードでも大文字と小文字が区別されます ( nullをどこでも小文字で記述していることに気づいたかもしれません)。つまり:
String firstName = Null; // Compilation error
String secondName = NULL; // Compilation error
String fullName = null; // This will compile
nullで他に何ができるか、何ができないかを見てみましょう。
-
任意の参照にnull を割り当てることができます。
StringBuilder sb = null;
-
null は任意の参照型にキャストできます。
String s = (String) null; // This will compile, but doing this doesn't make any sense :)
-
null をプリミティブ変数に割り当てることはできません。
int i = null; // This won't compile
-
null は==と!=を使用して比較できます。
-
null == null はtrueを返します
前のレッスンでは、Java のすべてがオブジェクトであり、すべてのオブジェクトに型があることについて説明しました。
この点でnullについて何が言えるでしょうか? nullは特定の型のリテラルであり、この型には名前がありません。また、この型には名前がないため、この型の変数を宣言したり、この型にキャストしたりすることはできません。したがって、この名前のない型を表すのはnullだけです。実際には、この型を無視して、null を任意の参照変数に割り当てることができる特別なリテラルと考えることができます。
覚えておくべきこと:
- null は参照データ型のデフォルト値です。
- null は「値がない」を意味します
- 値がnullのオブジェクトに対してメソッドを呼び出すと、コードはコンパイルされますが、実行時に NullPointerException が発生します。
GO TO FULL VERSION