Javaでnullステートメントが使用されるのはいつですか?


10

私がクラスを探してきた教科書で、それは述べられています、ステートメントは空になることができます(nullステートメント)。nullステートメントは、単なるセミコロンとして定義されます。

実行時にはまったく何もしません。nullステートメントはほとんど使用されません。

適度に経験のあるプログラマーとして、めったに使用されないと言うの興味深いことです。これは、どこかにその使用があることを意味しています。

そのような声明の使用はおそらく何でしょうか?

回答:


7

それはほとんど役に立たないですが、それが必要ないくつかの場所があります。例えば:

while (DoSomething());

これにより、DoSomething()falseが返されるまでメソッドが実行されます。明らかにこれは、メソッドがいくつかの有用な副作用も実行することを前提としています。ただし、空のステートメント、つまり末尾のセミコロンが必要です。それ以外の場合、whileループには次の次のステートメントが代わりに含まれます。

(ただし、他の回答と矛盾するのfor(;;) {}は、空のステートメントの例ではありません。for句の後の括弧にはステートメントが含まれていないため、セミコロンを使用して(オプションの)式を区切ります。詳細については、Java文法を参照してください。)


3
+1-これが実際に使用されたのを見たのはこれが唯一のときです(前述のように、「for」ステートメントの空のセクションは少し異なります)。私が行う唯一の変更は、通常のステートメントのように見えるwhileループの直後ではなく、nullステートメントが独自の行に残っている場合、この種の使用を読むのははるかに混乱しやすいことを指摘することです。ターミネーター...
Jules

12

文が構文的に必要であるが意味的には必要でない場合に使用できます。最も一般的なケースは、この例のようにforループの一部を省略することですが、ほとんどの人はその使用法が奇妙で読みにくいと感じています。あなたの本が言うように、それはめったに使われません。


それ。役に立たない言語機能です。Googleに「セミコロンのJavaのみ」を読ませるよりも、明示的に複製を読むことを強いられます。
Chris Cirefice

2
@ChrisCirefice一方、「セミコロンのみ:言語を適度に知っていることを考慮すれば、何をすべきかは非常に明白です。これは個別のルールではなく、他のルールの結果にすぎません。さらに、永遠にそれを知ってから学ぶと、だから私はそれは本当に問題ではないと思います
モーリシー

1
そのようなループを書いていると感じたら、何か間違ったことをしています。
Bassinator 2016

デバイスがオンラインに戻ったときにチェックするために使用するスリープポーリング方法があります。コードはほぼ次のようになりwhile ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }ます。もちろん、すべて別の行にあります。と書くこともできましたがwhile ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }、それは間違いです。
BobDalgleish

「void」メソッドを強制的に終了するために使用するのはnullステートメントではありませんか?void method(){ //code here. If(condition){return ;}}
Laiv

9

私はwhileループの使用を好みますが、null式を使用すると次のように記述できます。

for (;;) { thread.run(); }

ただし、nullステートメントで次のように記述できます。

while(true);
{
    thread.run();
}

その主な目的は、あなたの後に来て、なぜスレッドが実行されていないのか疑問に思っている貧しい保守プログラマーの時間を無駄にすることです。ステートメントはしばらく続く必要があります。孤独; ステートメントです。したがって、このステートメントブロックは実際にはループの一部ではありません。

それは良い利用法がないと言うことではありません。それらはまれです。通常は次のようになります。

{
    ;
}

この方法では、そうすることを意図しているように見えます(これで十分でない場合もあります)。

アセンブリでは、このnullステートメントはNOPと呼ばれます。Pythonでは、これをパスと呼びます。java(およびcの他の子)では、あなたが言ったようにセミコロンです。

私はいくつかの用途を知っています:

セマンティック

空のスペースと答えとしてゼロを置くことの間には違いがあります。はっきり言って、ここに何かを置くのを忘れなかった。これは何も意味がない。それは明白なものではありません。このスペースは意図的に空白にされています。これは、N / Aをコンパイルする方法です。

ヌルパターン

コンベヤーベルトから色付きの電球を繰り返しピックアップし、ソケットにねじ込み、電源を入れ、取り外し、次の電球をピックアップする複雑で高価な光信号機を想像してみてください。ベルトに付けた球根の色によって、このことのシグナルを制御できます。すばらしい、これで問題なく動作するようになったので、上司はこれらの信号のタイミングを制御する方法を作成するように求めています。メッセージ間のギャップを追加したいと考えています。多くの部分がこれらの信号のタイミングと、それらを同期させるのがどんなに大変かについて気にかけていることを恐怖で覚えています。これを行わずに週末に仕事を続けるために、どのようにタイミングを制御しますか?あなたは燃え尽きた電球のビンを見て、文字通りではありませんが、明るいアイデアを得ます。

ポリモーフィズムを使用して、何も壊さずに何かをオフにするだけの場合もあります。

デバッグ中

ブレークポイントを設定するときは、ブレークポイントを配置する場所が必要です。これで、一部のデバッガーで右中かっこに設定できるようになりましたが、そうでない場合は、その場所で何も実行しない場合でも、場所を強制的に配置できるようにすると便利です。

実際にはJavaのものではありませんが、次のものもあります。

バイナリいじり

アセンブリのNOP命令により、コンパイルされたバイナリ実行可能ファイルをいじることができます。しかし、最近のJavaコンパイラーは最適化を大幅に離れているため、セミコロンがうまく機能しないのではないかと思います。しかし、昔は実行可能ファイルでこれらの空のスポットを使用して、タイミングを制御したり、後でフックをドロップしたりすることもできました。NOPがない場合、実際の命令がそこにあるので、フックしたい場合は、フック用のスペースを空けるために、それらの命令を別の場所にコピーする必要があります。これは、Javaが構文の多くを取得するC言語でも同様に機能します。しかし、私はこのフックをいじくるのはJavaではあまり起こらないと思います。そのためにアスペクト指向プログラミングを使用します。


2
これは見苦しいように見えるかもしれませんが、の例forはnullステートメントではありません。Nullステートメント(空のステートメント)は他のステートメント(など)が発生する場所と同じ場所に発生する可能性がifありますが、次の括弧forはセミコロン間のステートメントを許可しませんが、オプションである初期化子と2つの式のみを許可します。したがって、セミコロンの使用方法は、文末記号とは異なります。空のステートメントは、最後のセミコロンになりますfor(;;);
JacquesB

あなたは正しい、これは奇妙なようです:P。私の編集に注意してください。
candied_orange

-7

Javaは人間の言語と一致しない方法で設計されているので、私はそれを使用します。Cにも同じことが言えます。

ステートメントはstatement;です。

if-then-elseステートメントは if (condition) statement; else statement;

複合ブロックを含むif-then-elseステートメントは if (condition) {statements} else {statements}

これは明らかにナンセンスです。

したがって、私if (condition) {statements} else {statements};はどちらが論理的で合理的であるかを書きます。

Javaの設計者がこれをif-then-elseの後にnullステートメントが続くものとして扱いたい場合は、問題ありません。それが彼らを幸せにするなら、それを彼らを幸せにする。


ですif (condition) {statements;} else {statements;}。また、Javaは;の後のsを必要としないことについてかなり一貫してい}ます。人間の言語が、疑問符で既に終了している文の終わりにピリオドを付けないことがよくあるようなものです。(確かに、!?またはで?!終わりますが、それらはインターロバン文字の単なる近似値です。)
8bittree

1
甘い神!! o_O
–ÁxelCostas Pena 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.