2017-12-12 14 views
1

私は現在、クライアント/サーバーソフトウェアを開発するプロジェクトに取り組んでいます。私は奇妙な問題を抱えていて、それをうまく解決しましたが、原因を完全に説明することができず、私は長い間捜索しました。while(真)は等しくないwhile(!false)

サーバー側でwhile(true)ループを使用して、以前のクライアントがソケットをクローズした後でもサーバーがクライアントを受け入れ続けるようにしたかったのです。

だから私はこのようにそれを構築しようとした:

public void run() { 

    Socket socket; 

    while(true) { 
     try { 
      socket = server.accept(); 

      BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); 
      BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 

      while (socket.isConnected()) { 
       // TODO income handling 
      } 

      in.close(); 
      out.close(); 
      socket.close(); 

     } catch (Exception e) { 
      break; 
     } 
    } 
} 

しかし、私はこのループに終了条件を追加するために私に言ってのIntelliJによるエラーメッセージが表示されました。しかし、私はキャッチステートメントで1つを持っています。

while(!false) 

while(true) 

を変更するには消えるために、エラーメッセージを主導してきました。誰も私に違いを説明して、最初の試みがうまくいかなかった理由は?私はそれが研究の間にこのように何回も行われたことを発見しました。

+4

IntelliJには 'while(true)'を検出し、while(!false)は検出しないようになっているためです。いずれにしても、例外がループが終了する唯一の方法であってはなりません。 –

+2

現在のIntelliJ IDEA(アルティメット版、2017.3)では、あなたのコードに対して警告も「while」エラーも表示されません。 '!false'のために私が得るのは、 '単純化することができます'ということだけです。 –

+0

ええ、 'break'ステートメントを削除すると警告が表示されますが、' break'があるときは警告は表示されません。また、無限ループ検査は、 '!false'が' true'と同じであることを理解するのに十分スマートです。どのバージョンのIDEAを使用していますか? –

答えて

0

おそらく、whileループ条件をフォーマットした方法が原因です。 式が複雑または畳み込みの場合。コンパイラは、T.J.と同じステートメントを認識しません。 Crowderは上記のとおりです。別の説明は、作成したwhile(!false)が実際にはwhile(!false)ではないということです。あなたが他の人のより明確な助けを得るためにwhileループを変更したことを示してください。

0

これでアプリをパッチしています。

IDE(IntelliJ)は、あなたがしてはならない何かをしていることを検出し、IntelliJが悪い習慣を悪化させないようにしようとします。

条件をある時点で終了できるフラグに変更するか、フラグの評価を使用します。

ところで、無限ループ内の無限クラスとインスタンスを宣言するのはひどい悪い習慣です。

1

まず、IntellJ IDEA検査の目的は、あなたの人生を困難にすることではなく、問題のあるコードをすばやく発見することです。 IDEを幸せにするためにコードを変更しないでください。

この検査(「 'while'文は例外をスローせずに完了できません」)は、デフォルトで警告を生成します。 エラーが本当にある場合は、誤ってこの検査の設定を変更した可能性があります。 利用可能な検査のリストとその重大度の設定は、[設定]ダイアログの[エディタ]> [検査]タブで確認できます。

while (true)while (!false)の違いについて: これらのコードはどちらも等しいバイトコードを生成するので、違いはなく、この意図の実装が欠落しています。

あなたができる特定の意図についての警告を表示したくない場合は、次の

  1. 強調表示コード(この場合はwhile)上の場所のテキストキャレット
  2. プレスAlt-Enter
  3. 選ぶだけで開け中コンテキストメニュー「検査 『無限ループ文』オプション」

のいずれか

  • この特定の文(メニュー項目「文のSuppress」)のためにそれを無効に
  • またはオープンの設定ダイアログ(メニュー項目「編集検査プロファイルの設定(メニュー項目「無効検査」)完全にこの検査を無効にします")。