2016-09-28 6 views
1

「初期化されていない可能性があります」エラーが初期化されていない可能性がある変数を、どのパスで確認できるのでしょうか?好ましくは、JavaにネイティブまたはIntellijに組み込まれていますか?Java - これを処理する方法は "初期化されていない可能性があります"というエラー?

EDIT:最小の障害の例に自分のコードを減らすために管理

class MyFailure{ 
    public static void main (String[] args) throws java.lang.Exception{ 
     String test; 
     boolean abort = false; 
     while(!abort){ 
      if(false){ 
       abort = true; 
       continue; 
      } 

      test = "stupid"; 
      if(test.equals("stupid")) break; 
     } 

     if(!abort){ 
      System.out.println(test); 
     } 
    } 
} 

Main.java:21: error: variable test might not have been initialized

緩衝値が一定の条件を満たし、if(false)になるまでwhileループは、サーバソケットから読み出し仮定実際にクライアントが接続を終了したかどうかをチェックします。どうすればこの問題を処理することを提案しますか?これはあなたの現実のコードに作動しているかどうか

public static void main (String[] args) throws java.lang.Exception{ 
    boolean abort = false; 
    while (!abort){ 
     if (false) { 
      abort = true; 
      continue; 
     } 

     String test = "stupid"; 
     if (test.equals("stupid")) { 
      System.out.println(test); 
      break; 
     } 
    } 
} 

:Javaはあまりにもそれが値を持って見ることができますループ内で変数を使用する:あなたの問題のコードはかなり簡単な解決策があるのために

+1

あなたの目でパスが見つからない場合は、コードが複雑すぎます。それを示す。 – Kayaman

+1

私の経験上、決定の仕方はあまりにもスマートではありません(問題を複雑にしすぎてはいけません)。たとえば、メソッド内で互いに後に2つのif-else構文があり、最初の特定のパスに2番目のパスが含まれていることがわかっている場合、Javaはそれを理解しません。したがって、変数が最初のパスから1つのパスでのみ初期化された場合、Javaでは2番目のパスのいずれのパスでも値を使用させません。 –

+0

考えられるトリックは、宣言の変数にナンセンス値を割り当てることです(intの場合は-4736など)。 2つの良い効果があります:Javaは満足しています。プログラミングエラーのためにナンセンス値が使用されるかどうかを確かめることができます。 –

答えて

1

分かりません。ソケットから取得した値を処理するためのメソッドを抽出し、例の中にSystem.out.println()がある場所から呼び出すことを検討してください。

編集:それは価値があるため、次のバージョンもコンパイルされます。あなたはまだそれが可読性減少した値(println)の使用は非常に深くネストされていると思うことがあります。

コメントで述べたように
public static void main (String[] args) { 
    if (! isFalse()) { 
     String test; 
     do { 
      test = "stupid"; 
     } while (! isFalse() && ! test.equals("stupid")); 
     if (! isFalse()) { // connection still open, so not aborted 
      System.out.println(test); 
     } 
    } 
} 

private static boolean isFalse() { 
    return false; 
} 

私は時々やる - ためらい - 無意味で問題の変数を初期化するに頼ります/偽の値を宣言に入れると、プログラミングエラーのためにその値が使用された場合、私は発見します。あなたの例では、私はnullを使用することがあります:

String test = null; 

そして、ループの後:

assert test != null; 

それが適切な値を取得していない場合ので、私はキャッチします。それは私が満足している解決策ではありませんが、私はより良いものを見つけることができません。

+0

私の例の '' println''を考えると、最も読みやすい解決策は、はるかに複雑なコードのためのダミーであり、例えば受け取った値によっては、ソケットからさらにデータを要求しなければならないかもしれません。 (また、そのような巨大なものの中で問題が発生したので、巨大なものの中で膨大な時間を費やしながら、変数を実際に初期化したことをJavaに伝えるため)。 – User1291

+0

私はまだ複雑なコードを別の方法で使用すると、扱いやすいものになる可能性があります。私はあなたのコードを見ていない、しかし、私の言葉をそれに取っていない。 –

+0

あなたは知っています...私は '' String test = null''を設定し、 '' null''をテストすると、intellijは> '' test!= null''が常にtrueであることを警告します。しかし、もし '' = null''を取り除くと、「初期化されないかもしれません」というエラーが出るので、私は文字列に代入していると言うことができると同時に、 t ....奇妙な。 – User1291

関連する問題