2017-11-07 13 views
1

javaで有効な参照があるかどうかを調べる最良の方法が何か不思議でした。私はこの構文が動作することを知っていますが、その口はいっぱいです。参照がJavaでnullであるかどうかをチェックする最も良い方法

if (myObj == null) { 
    // Do something knowing we have an object 
} 

私は、C++のようなポインタをチェックできる他の言語から来ています。

char* prt = null; 
if (ptr) { 
    // We know we have a valid c-string 
} 

javaに曖昧さや類似の構文はありますか?コンパイラの拡張機能やプリプロセッサを使っても問題ありません。

フォローアップ前。あなたがなぜ=記号を忘れる可能性があるので、なぜ私はちょうどjava構文を使用すべきかについて話を始める前に、ジャンプする前にいくつかジャンプしてください。

コンパイラ/リンターによって捕捉されます。

あなたはもう少し長いったらしい表記にC++我々のに対して

if (myObj == null)

を使用する必要がありますので、残念ながらJavaは、boolnullptr_tまたはポインタ型のアナログの暗黙的な変換を持っていない

+0

また、他の言語では「無効」とみなされるかなりの値があります。 '0'や' false'や '' ''などです。 Javaでは、あなた自身が有効とみなされるものを正確に定義する必要があります。 –

+2

「ヌル」は慣用であり、読みやすいようにしています。 Cが '0x0'を使用するという事実は、実装の詳細IMOです。 – StuartLC

+2

これはあなたを助けます:https://stackoverflow.com/a/2707333/2724879 –

答えて

4

この点で

if (myObj)

を書くことができ、Javaはあまり簡潔、かつ間違いなく明確です。

4

nullのJavaでのチェックのためのショートカット構文はありません。他の言語で使用可能なヌル結合またはヌル伝播演算子もありません。ユーザ定義の変換演算子もありません。したがって、オブジェクトを返す式にループを書くことができるC++イディオムを使用することはできません。 while (cin >> x) { ... }

しかし、nullが完全にチェックされるのを避けるために、Java 8には強力な代替手段が存在します。無効なオブジェクトをOptional<T>にラップし、そのメソッドを使用してヌルチェックを非表示にします。ここ

が短い例である:

String s = "Hello"; 
Optional<String> os = Optional.ofNullable(s); 
os.ifPresent(x -> { System.out.println(x); }); 

上記prints"Hello"snullに設定すると、コードは何も印刷しません。

Oracle's article on using Optional<T>.

+1

「選択」とそのメソッドを呼び出すコンシューマの間にAPIがある場合に最適です。しかし、 'if(x == null){...}'が行うときに 'Optional.ofNullable(x).ifPresent(...)'を使わないでください。 – slim

+0

@スラムもちろん、そうではありません!私は、ハエを殺すのにいかに効率的であっても、ハッピーハンマーでハエをスワッピングするというアイデアは好きではありません。 – dasblinkenlight

1
if(x == null) { 
    doSomething(); 
} 

... Javaで一般的なイディオムです。 Javaの設計者は、ブール値でない変数を暗黙の「真実」値として扱わないように決定しました。

他の一般的なイディオムは三文でx == nullを使用することです:

return x == null ? "not found" : x; 

またはヌルに早期に例外をスローする標準的な方法を使用する:

Objects.requireNonNull(x); 

をより一般的には、ヌルが渡されることを決して期待しないプログラミングスタイルを採用しようとするため、可能性をコード化する必要はありません。

公開されていないAPIでは、決してnullを渡すことはないので、ヌルをテストする必要はありません(NullPointerExceptionが発生した場合、ヌルを渡した人は誰でも自分自身の責任を負うことができます)。

パブリックAPIの場合、渡された時点で非nullを検証することは呼び出し元には礼儀ですが、必ずしもすべての場合に必須ではありません。

合理的な目標は、入力が常にnullではなく、nullを返すことを常に期待することです(Java 8以降、必要に応じてOptionalを使用するか、Null Object Patternを採用します)。

+1

最初にヌルを使用しない、または期待しないことの慣行。 – VGR

関連する問題