web-dev-qa-db-ja.com

初期のJava文字列値をnullから ""に設定する必要がありますか?

多くの場合、そのようなクラスがあります:

public class Foo
{
private String field1;
private String field2;

// etc etc etc
}

これにより、field1とfield2の初期値がnullになります。次のようにすべての文字列クラスフィールドを持つ方が良いでしょうか?

public class Foo
{
private String field1 = "";
private String field2 = "";

// etc etc etc
}

それから、もしクラス定義と一貫していれば、多くのヌルポインタの問題を回避できます。このアプローチの問題点は何ですか?

44
Martlark

他のポスターには同意しません。空の文字列を使用してもかまいません。可能な限りそれを使用することを好みます。

ほとんどの場合、null文字列と空の文字列はまったく同じもの、つまり未知のデータを表します。 nullまたは空の文字列で表現するかどうかは選択の問題です。

7
John O

その方法は(通常)狂気にあります。多数のヌルポインターの問題に遭遇した場合、それは実際にデータを設定する前に使用しようとしているためです。これらのヌルポインターの問題は、その使用法がどこにあるかを示す不快な警告サイレンであり、問​​題を解決することができます。最初に空に設定しただけの場合、実際にそこに期待していたものではなく、それらを使用する危険があります。

71
Yuliy

絶対違う。空の文字列と空の文字列はまったく別のものであり、混同しないでください。

さらに説明するには:

  • 「null」は「この変数を初期化していないか、値がありません」という意味です
  • 「空の文字列」とは、「値が何であるかを知っていますが、空です」という意味です。

Yuliyが既に述べたように、nullポインター例外が多数発生している場合、値がない場合に値があることを期待しているため、または使用する前に値を初期化するのが面倒です。どちらの場合でも、適切にプログラムするために時間をかける必要があります-値を持つべきものにそれらの値があることを確認し、値を持たないかもしれないものの値にアクセスしている場合、それを考慮に入れることを確認してください。

50
Paul Tomblin

実際、特定のケースで値が他のどこかに設定される前に使用され、そのケースで空の文字列として動作するのは理にかなっていますか?つまり、実際には空の文字列が正しいデフォルト値であり、デフォルト値を持っているのは理にかなっていますか?

答えが「はい」の場合、宣言で「」に設定するのが正しいことです。そうでない場合は、バグを見つけて診断するのを難しくするためのレシピです。

9

一般に、これを避けるのが最善です。いくつかの理由:

  1. NullPointerExceptionを取得することは、通常、使用する前に変数を使用していること、または変数を設定するのを忘れたことを示す適切な警告です。それを空の文字列に設定すると、NullPointerExceptionがなくなりますが、プログラム内の行のさらに別の(さらに追跡が困難な)バグが発生する可能性があります。

  2. Nullと ""には有効な違いがあります。 null値は通常、値が設定されていないか、値が不明であることを示します。空の文字列は、意図的に空に設定されたことを示します。プログラムによっては、その微妙な違いが重要になる場合があります。

7
Eric Petroelje

これは古い質問ですが、次の点を指摘したかったのです。

  String s = null;

  s += "hello";
  System.out.println(s);// this will return nullhello

一方、

  String s = "";

  s += "hello";
  System.out.println(s); // this will return hello

明らかにこれに対する本当の答えは、単に文字列を連結するのではなく、StringBufferを使用する必要があるということです。

3
Nilesh Tailor

私はどちらも提案しません。

代わりに、フィールドに適切な値を指定する必要があります。変更する必要がない場合は、最終決定します。

public class Foo { 
    private final String field1; 
    private final String field2;
    public Foo(String field1, String field2) {
       this.field1 = field1;
       this.field2 = field2;
    }
    // etc. 
} 

割り当てる必要はありません、私はまだ初期化されていない値です。初期値を指定してください。

3
Peter Lawrey

これを避けるため、インスタンスにデータが正しく入力されていないかどうかを知る必要があります。

1
NSherwin

とんでもない。どうしてそんなことをしたいのですか?それは間違った結果をもたらします。ヌルと「」」は同じではありません。

1
vsingh

String s = nullを使用すると、スタックにのみ変数 "s"が作成され、ヒープにはオブジェクトは存在しませんが、String s = ""のように宣言するとすぐになります。ヒープに ""オブジェクトを作成するようになります。文字列は不変なので、ヒープに新しいオブジェクトを作成するたびに変数に新しい値を割り当てるたびに... String s = ""よりも効率的です。

提案は大歓迎です!!!!!

1
kunal

Nullの方が優れているため、これらは未チェック例外{Nullポインター例外}と呼ばれます。例外がスローされると、そのメソッドを呼び出す前に例外をnull以外の値に初期化する必要があることが通知されます。

もしあなたがそうするなら

private String field1 = "";

エラーを抑制しようとしています。後でバグを見つけるのは難しいです。

0
vinaynag