人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JAVAプログラミングについて質問です。
NULLと""(ダブルクォーテーション2つ)の違いについてのふとした疑問です。
String型の変数をクリアするときは(1)と(2)のどちらがよいでしょうか
(1)変数名 = null;
(2)変数名 = "";
他人のコードを読むと(1)が多く、(2)は初心者の方に多いように思えます。
どちらでも意味的にはよいのですが、それぞれ選んだ理由をおしえてください。
プログラミングの作法的な観点からの回答などであればうれしいですが、どんなことでもいいです。

●質問者: cg_121
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Java String クリア コード ダブル
○ 状態 :終了
└ 回答数 : 11/11件

▽最新の回答へ

1 ● tokuya_n
●16ポイント

ユーザは「""」を入力するかも知れません。

ユーザが「null」を入力することはないでしょう。

従って、初期化というなら「null」のほうが良いと思います。


パフォーマンスとかメモリをケチるとかその辺の理由もあるでしょう。

空文字かどうかのチェックしたければ、大抵は両方を見ることになるわけですか。

◎質問者からの返答

なるほど。

初期化されてるのか入力値なのかの区別ということですね。ありがとうございます。


2 ● hissssa
●16ポイント

String型変数にnullを指定するということは、その変数を明示的に「値が設定されていない」状態にすることになります。一方、""を指定するのは「空白な文字列を割り当てる」事を意味します。

この、「値が割り当てられているか否か」ということが、使い方に関わってきます。分かりやすい例では、nullを割り当てた変数に対して参照を行うと、Null Pointer Exceptionが発生することになります。

String st1r = null;

String str2 = "Value:"+str1; ←Exceptionになる

では空白文字列を設定した方がいいかとなると、そういうわけでもありません。変数に値が割り当てられているか否かで処理を分岐するような場合です。

String str = null;

<<何かの処理>>

if( str!=null ) {

<<何かの処理で値が割り当てられた場合>>

} else {

<<そうでない場合>>

}

処理によっては、空白文字列も意味を持つこともありますので、上記のような判定で空白文字列か否かを基準に使うのは正しくないとなります。

まぁ要はケースバイケースということですね。

◎質問者からの返答

。。。すみません

public static void main(String args[]){

String str1 = null;

String str2 = "Value:"+str1;

}

↑Exceptionは起きませんでした。。。でも意味はわかりますよ。

こちらも、

>処理によっては、空白文字列も意味を持つことも

とうことで、条件分岐の判定で混同してしまう問題があるということですね?ありがとうございます。


3 ● くまっぷす
●16ポイント

hissssaさんとほぼ同じ意見です。

Null Pointer Exception例外をcatchして動くようなプログラミングをしたいのならnullを使うのもありかと思います。

try{

何かの処理

}catch( NullPointerException e){

初めて値が入るとみなして設定させる処理

}

など。

例外ハンドラーを使う書き方はうまく使うとif文のネストや条件の列挙を減らして全体の見通しをよくすることができます。

しかし空文字列の判定にnullを使うというのはプログラムの意味的にはおかしいですね。たぶんあとで混乱する元になりそうな気がします。

◎質問者からの返答

つまり、(1)のようにNullで初期化するとNullPointerExceptionを利用した書き方もできる、ということですね。ありがとうございます。

では、変数が空であるという判定にnullを使うと、なぜおかしいのでしょうか?


4 ● dev_zer0
●16ポイント

Stringをクラスとして認識しているか、プリミティブ型と認識しているかの違いと思われます。

JavaではStringクラスは他のクラスとは違い、文字列の連結を+で行うことができますし、

JavaのルートクラスであるObjectクラスにはtoStringメソッドが存在します。


私の場合、使い捨てのいわゆる「動けばいいや」的なプログラムを作る場合は""でクリアしてしまい、

できるだけ忌々しいNullPointerExceptionを出さないようにします。

そして、仕事で作る場合は、バグの兆候を示すNullPointerExceptionを

可能な限り検出する確率を上げたいのでnullでクリアします。

◎質問者からの返答

きちんとしたものを作るときは、Nullのクリアの方がいいということですかね。参考にさせていただきます。ありがとうございます。


5 ● b-wind
●16ポイント

自分なら、

・初期化をしたいなら null

・初期値を設定したいなら "" (空文字列)

を使うと思います。

null は明示的に値が存在しない事を表すので本来的には意味が近いはず。


Nullで初期化するとNullPointerExceptionを利用した書き方もできる

可能では有りますが、大抵の場合推奨されません。

理由はいくつか有りますが、

・NullPointerException が RuntimeException であるために文法上 catch を強制されず、取りこぼす可能性がある。

・NullPointerException に限らず、Exception の発生は現在の Java の実装においてコストが高い。(負荷が高い)

ため、正常系の実装としては避けるべきだと思います。

もちろん、本来の意味の Exception の発生は問題ありません。(アルゴリズムのミスなどで null でないはずの場所で null だったなど)


では、変数が空であるという判定にnullを使うと、なぜおかしいのでしょうか?

変数が「空」である判定なら問題ありません。

id:Kumappus さんは「空文字列」の比較に使うのはおかしいと仰っています。

良いか悪いかは置くとして、変数が「空(null)」と「空文字列」とはプログラム上別の意味を持っているということです。

◎質問者からの返答

う?ん、だんだん難しくなってきました。つまり逆にいうと、

・初期化には""は使わない。

・初期値を設定するときにはNullは使わない。

ということですか?

今度は「初期化」と「初期値を設定する」ことの違いがわからなくなってしまいました・・・。

たとえば宣言が、

String 変数名 = new String();

のような変数の場合は、初期値が無いのでどちらかというと「クリア」=「初期化」だと思うので、Nullのほうですかね。。。?

>・NullPointerException が RuntimeException であるために文法上 catch を強制されず、取りこぼす可能性がある。

catchしなくてもコンパイルできるという意味ですよね?この場合、NullPointerExceptionを想定しているはずですが、ついうっかり、ということがあると面倒ですよね。なるほど。

>・NullPointerException に限らず、Exception の発生は現在の Java の実装においてコストが高い。(負荷が高い)

あまり使わないほうがいいかもしれませんね。。

id:Kumappus さんは「空文字列」の比較に使うのはおかしいと仰っています。

確かに、「空文字列の判定に・・・」と仰ってますね。意味を間違えたようです。


1-5件表示/11件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ