2015-11-23 6 views
12

AndroidスタジオでAndroidアプリを開発するときに、whileループ内で使用される変数の値が正しくありません。Android:whileループで変数の値が正しくない

  1. は、Android Studioで新しいプロジェクトを作成し、空白の活動
  2. 主な活動へ

メソッドONSTARTを次のコードを追加します:私は非常に単純なケースにテストケースでそれを減少

@Override 
public void onStart() { 
    super.onStart(); 

    int count = 2; 
    int index = 1; 

    int value = 23; 

    Log.i("test", "value before = " + value); 
    while (index < count) { 
     Log.i("test", "value in while loop = " + value); 
     index++; 
     value = 0; 
    } 
} 

出力テストアプリケーションを実行している:

value before = 23 
value in while loop = 0 

結果が

value in while loop = 23 

デバッグする必要がありながら、予想通り、結果は(「= 23 whileループ内の値」)ですが、通常のデバッグビルドでは、それは間違っています。主なアクティビティクラスの逆アセンブルされたコードはOKです。変数 'value'の値は、whileループ本体の最後で0に設定されています。 whileループ本体内のあるコードまたは関数が変数 'value'を使用すると、23ではなく0になります。テストケースでは、Logステートメントを使用して簡略化します。

私は

if (value == 23) { 
    value = 0; 
} 

または私は

value = 0; 

行を削除するときに、それはいくつかの最適化のエラーのように見えるにライン

value = 0; 

を変更したときにそれは間違って行きません。しかし、これを引き起こす可能性のある最適化は何ですか?それはコードを信頼できないものにします。

+1

本当にあなたの特定のJavaバージョンと最も重要なJVMに依存します。しかし、はい、Javaは最適化を行い、JVMはランタイムの最適化を行い、ループアンローリングは最適化の対象となります。たとえば、ここをクリックしてください:[Java JIT loop unrolling policy?](http:// stackoverflow。com/questions/7243221/java-jit-loop-unrolling-policy)を参照してください。 – paulsm4

+1

サムスンですか? – zapl

+0

実際に何かの値を使用すると、オプティマイザは値を変更しないように見えます。ログステートメントがカウントしていないように見えることを忘れないでください。 – mjstam

答えて

0

あなたが書かれたコードは、今から後、正常に動作することを本当に確信している場合、あなたは(注文)を確認するために開始する必要があります

  • 設定 - >プロジェクトの設定は、Javaのバージョンとは全くokです、のJDKまたはJavaのバージョンが使用されているAndroidライブラリと互換性がありますか?あなたのJavaとAndoridライブラリは正しく設定されていますか?
  • 環境 - >あなたのデバッグエミュレータはサードパーティライブラリですか、デバッグデバイスがあなたのコードをデバッグするのに有効なデバイスですか?あなたのコーディングOSはide、Javaバージョン、Androidライブラリと互換性がありますか?
  • JVM - >使用しているバージョンのJava jdkの正しいソースをアンインストールして再インストールしてみましたか?

たぶん、あなたはJavaのバージョン、Androidの分バージョン、OSや使用しているIDEのようなあなたの環境に関するいくつかの詳細を与える必要があります。

これらの箇条書きで、あなたの問題を解決するための適切な関連付けができれば幸いです。

関連する問題