何が実行されるかという点で機能的に問題があることはわかりませんが、コードとコンパイラーが想定どおりに動作していることを証明するのに1時間も無駄にしています。
このコードを検討してください:
public int getAnswer(int a) {
int retval = 18;
int x = 25;
int y = 50;
while (a-- > 0) {
if (a == 3) {
retval = a;
return retval;
}
}
x = 10;
y = 20;
return 0;
}
と呼ばれる
int theAnswer = getAnswer(6);
return
を含む両方の行をブレークポイントし、コードを実行する前に、結果を予測してみてください。したがって、どちらの行がヒットするかを予測してください。
私の質問の口調から想像できるように、間違った行が強調表示されますが、正しい結果が返されます。コードをステップスルーすると、コードはかなり踊ります。
正しい行が表示されるように別の方法で構成できるものはありますか? (私は最新のAndroid Studioを使用しています。これは不安定である可能性がありますが、しばらく前にEclipseで同様の動作が見られたと確信していますが、追跡に時間を費やしたことはありません。それはダウンしています;おそらくそれはJavaもの)です。
これは、Androidにパッケージ化するためにJava .classファイルを.dxファイルに変換するビルドの一部であるdxの問題です。これによると:
https://code.google.com/p/Android/issues/detail?id=3419
関数に複数のreturnパスがある場合、dxはreturn命令を単一のreturn命令にマージするため、デバッグ中に、デバッガーはreturnがどの行に属しているかを認識できず、処理がジャンプします。これは、問題を再現しようとしたときに表示される内容に対応しています。ループを通過するたびに、if (a == 3)
チェックが実行され、最後にreturn 0
にジャンプしてから、ループに戻ります。 。最後のreturn 0
がループの途中でreturn retval
とマージされているのがわかります。
これがすぐに修正されるとは思えないので、一緒に暮らすことを学ぶ必要があるかもしれません。すみません、ちょっとクレイジーだと思います。
少なくともAndroid SDKソースコードにステップインするために)私のために働いたものは次のとおりです。
build.gradle
ファイルを開き、それに応じてcompileSdkVersion
の値を設定します。compileSdkVersion
を元に戻します。[ビルド]-> [プロジェクトの再ビルド]を試してから、Shift + F9を試してください。アプリケーションで実行されている古いコードがあります。