web-dev-qa-db-ja.com

Java変数が初期化されたかどうかを確認する

Phpのisset関数に似たものを使用する必要があります。私はPHPとJavaは極端に異なるが、PHPはプログラミングに似たものに関する以前の知識の唯一の基礎です。インスタンスがあるかどうかについてブール値を返すメソッドの種類はありますか変数が初期化されたかどうか。たとえば...

if(box.isset()) {
  box.removeFromCanvas();
}

これまでのところ、プログラムがまだ構築されていないオブジェクトを非表示または削除しようとすると、ランタイムエラーが発生するという問題がありました。

37
CaldwellYSR

変数に値が明示的に割り当てられているかどうかに興味があると仮定すると、答えは「実際にはない」です。まだ明示的に割り当てられていないフィールド(インスタンス変数またはクラス変数)にはまったく違いはありません。デフォルト値-0、false、nullなど.

これで、if一度割り当てられると、値は決してnullの値を再割り当てしないことがわかります。

if (box != null) {
    box.removeFromCanvas();
}

(また、可能性のあるNullPointerExceptionも回避します)が、「nullの値を持つフィールド」は「明示的に値が割り当てられていないフィールド」と同じではないことに注意する必要があります。 Nullは完全に有効な変数値です(もちろん、非プリミティブ変数の場合)。実際、上記のコードを次のように変更することもできます。

if (box != null) {
    box.removeFromCanvas();
    // Forget about the box - we don't want to try to remove it again
    box = null;
}

この違いは、ローカル変数でも見られます。ローカル変数は、「明確に割り当てられる」前に読み取ることはできませんが、確実に割り当てることができる値の1つはnullです(参照型変数の場合)。

// Won't compile
String x;
System.out.println(x);

// Will compile, prints null
String y = null;
System.out.println(y);
66
Jon Skeet

インスタンス変数またはフィールドは、静的変数とともに、変数タイプに基づいてデフォルト値が割り当てられます。

int:0
char: '\ u0000'または0
double:0.0
ブール値:false
reference:null

ローカル変数(ブロック内で宣言されたメソッド、forループ、whileループ、try-catchなど)がデフォルト値に初期化されず、明示的に初期化する必要があることを明確にしたいだけです。

6
Protongun