[解決済み】Javaのnullとは何ですか?
質問
とは何ですか?
null
?
は
null
何かのインスタンス?
どのようなセットで
null
に属するか?
メモリ内ではどのように表現されていますか?
どのように解決するのですか?
<ブロッククオートnullは何かのインスタンスなのか?
いいえ。
null
は
instanceof
.
15.20.2 型比較演算子
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
実行時に
instanceof
演算子はtrue
の値であれば RelationalExpression でない場合null
という参照にキャストすることができました。 ReferenceType を発生させることなくClassCastException
. そうでなければ、結果はfalse
.
これは、任意の型に対して
E
と
R
の場合、任意の
E o
ここで
o == null
,
o instanceof R
は常に
false
.
null」はどの集合に属するのでしょうか?
JLS 4.1 型と値の種類
また、特別な ヌル の型、式の型
null
という名前を持っていない。なぜなら ヌル 型は名前を持たないので,この型の変数を宣言することはできません。 ヌル 型にキャストしたり ヌル 型になります。またnull
の式で唯一可能な値です。 ヌル 型になります。またnull
の参照は常に任意の参照型にキャストすることができます。実際のところ、プログラマは ヌル という型がありnull
は単なる特別なリテラルで、どのような参照型にもなり得ます。
<ブロッククオート
nullとは何ですか?
上のJLSの引用にあるように、実際には、単に "任意の参照型を持つことができる特別なリテラルである" ということにしておけばよいのです。
Javaでは
null == null
(となります(他の言語では必ずしもそうとは限りません)。また、契約上、この特別なプロパティも持っていることに注意してください(from
java.lang.Object
):
public boolean equals(Object obj)
任意の非
null
基準値x
,x.equals(null)
べきであるreturn false
.
また、それは デフォルト値 (それを持つ変数の場合)すべての参照型に対応します。
JLS 4.12.5 変数の初期値
- 各クラス変数、インスタンス変数、配列コンポーネントの初期化は デフォルト値 が作成されたとき。
- すべての参照タイプにおいて、デフォルト値は
null
.
その使い方はさまざまです。と呼ばれるものを有効にするために使うことができます。
遅延初期化
フィールドの初期値が
null
実際に使用されるまでは、quot;real" の値に置き換えられます(計算が高くつくかもしれません)。
また、他の使い方もあります。実際の例を挙げてみましょう。
java.lang.System
:
public static Console console()
リターン : システムコンソールがあればそれを、なければ
null
.
これは非常によくある使用パターンです。
null
は、オブジェクトの非存在を示すために使用されます。
もう一つの使用例です。
java.io.BufferedReader
:
public String readLine() throws IOException
リターン : A
String
行の内容を含み,行終端文字を含まないもの,またはnull
ストリームの終端に達した場合。
だから、ここで
readLine()
を返します。
instanceof String
を返すまで、各行に対して
null
で終わりとする。これにより、各行を次のように処理することができます。
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
APIを設計することで、終了条件が
readLine()
戻る
null
しかし、このデザインには、物事を簡潔にする利点があることがわかる。なお、空行の問題はありません。空行は
"" != null
.
別の例で、今度は
java.util.Map<K,V>
:
V get(Object key)
指定されたキーがマッピングされた値を返す、または
null
このマップにキーのマッピングがない場合。このマップが
null
の値が返されます。null
は、必ずしもマップにそのキーのマッピングがないことを示すわけではありません。null
. またcontainsKey
の操作は、この2つのケースを区別するために使用することができる。
ここで
null
は物事を複雑にする可能性があります。最初の文は、キーがマッピングされていない場合は
null
が返されます。2つ目のステートメントでは、キーがマッピングされている場合でも
null
できる
また
が返される。
それに対して
java.util.Hashtable
を許可しないことで、物事をよりシンプルにすることができます。
null
キーと値で構成され、その
V get(Object key)
を返す場合は
null
これは、キーがマッピングされていないことを意味します。
残りのAPIを読めば、どこでどのように
null
が使用されています。これらは常に
ベストプラクティス
の例です。
一般的に言えば
null
は、特殊な値として意味づけするために使用します。
- 未初期化状態
- 終了条件
- 非既存オブジェクト
- 不明な値
メモリ内ではどのように表現されているのでしょうか?
Javaで?関係ないでしょ。そして、そうしておくのが一番です。
です。
null
は良いことなのか?
これはもう主観とのボーダーラインです。ある人はこう言います。
null
は、回避できたはずの多くのプログラマーエラーを引き起こします。ある人は
NullPointerException
Javaでは、プログラマーのエラーに迅速に対応できるため、これを使うのは良いことです。また
null
を使用することで
Nullオブジェクトパターン
などがあります。
これはそれ自体で大きなトピックなので、別の質問に対する回答として議論するのがベストです。
の発明者の言葉を引用して終わりにします。
null
を、自分自身で作っています。
C.A.R.ホア
(quicksortで有名な)。
私はこれを10億ドルの失敗と呼んでいます。
の発明であった。
null
1965年のことです。当時、私はオブジェクト指向言語(ALGOL W)において、参照のための最初の包括的な型システムを設計していました。私の目標は、コンパイラが自動的にチェックを行い、参照の使用は絶対に安全であることを保証することであった。しかし、私はその誘惑に勝てずに
null
を参照することで、簡単に実装することができます。その結果、無数のエラーや脆弱性、システムクラッシュが発生し、この40年間でおそらく10億ドルの痛手と損害を被ったことでしょう。
その このプレゼンテーションのビデオ より深い内容になっていますので、ぜひご覧ください。
関連
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] ORA-01654: インデックスを拡張できません。
-
[解決済み] java.io.IOException。DER長の短い読み取り
-
[解決済み] x--やx++はここで何をするのですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Firebase クラスにシリアライズするプロパティが見つからない
-
[解決済み] ストリングビルダー.イコール Java
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] Java UnknownFormatConversionException
-
[解決済み] javax.naming.NameNotFoundException
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] Maven: assembly-pluginが全く実行されない