Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6) 1 P a g e
單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e
單步除錯 (2/10) 點下 Next Next 3 P a g e
單步除錯 (3/10) Finish, 這邊需要等候一下 請在 res/layout/activity_main.xml 填入下頁的程式碼 4 P a g e
單步除錯 (4/10) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <LinearLayout > <TextView android:layout_width="wrap_content" android:text="height"/> <EditText android:id="@+id/heightedittext" /> </LinearLayout> <LinearLayout > <TextView android:layout_width="wrap_content" android:text="weight"/> <EditText android:id="@+id/weightedittext" /> </LinearLayout> <Button android:id="@+id/calcbutton" android:text="calc" android:onclick="clickbutton"/> <TextView android:id="@+id/bmitextview" /> </LinearLayout> 5 P a g e
單步除錯 (5/10) 在 java/mainactivity 填入以下程式碼, 你可能要適時地修改 package 名稱 package game.csie.ntut.edu.tw.bmi; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.edittext; import android.widget.textview; public class MainActivity extends Activity { EditText heightedittext; EditText weightedittext; TextView bmitextview; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); heightedittext = (EditText) findviewbyid(r.id.heightedittext); weightedittext = (EditText) findviewbyid(r.id.weightedittext); bmitextview = (TextView) findviewbyid(r.id.bmitextview); public void clickbutton(view view){ double height = 0, weight= 0; double bmi; height = Double.parseDouble(heightEditText.getText().toString()); bmi = weight / (height * height); bmitextview.settext("bmi:" + bmi); 6 P a g e
單步除錯 (6/10) 執行專案發現執行結果錯誤, 開始進行 Debug 點擊 bmitextview. 這一行的左方, 開啟中斷點 7 P a g e
單步除錯 (7/10) 使用 Debug 來進行除錯 使用 Step Over(F8) 可直接跳過一行 8 P a g e
單步除錯 (8/10) 使用 Step Into(F7) 可進入函數內部 使用 Force Step Into(Alt+Shift+F7) 可強制進入函數 9 P a g e
單步除錯 (9/10) 使用 Step Out(Shift+F8) 可直接跳出函數 我們觀看下方 Variables 視窗, 可發現 weight 的值 =0, 需要進行修改 10 P a g e
單步除錯 (10/10) 加入程式碼 weight = Double.parseDouble(weightEditText.getText().toString()); 成功 11 P a g e
條件式中斷點 (1/6) 請仿造前一個範例建立一個專案 請在 res/layout/activity_main.xml 填入下頁的程式碼 12 P a g e
條件式中斷點 (2/6) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <LinearLayout > <TextView android:layout_width="wrap_content" android:textappearance="?android:attr/textappearancemedium" android:text="init" /> <EditText android:id="@+id/initedittext" android:editable="false"/> </LinearLayout> <Button android:layout_width="wrap_content" android:layout_margintop="10dp" android:text="bubble Sort" android:onclick="sortbuttonclick"/> <LinearLayout android:layout_margintop="10dp"> <TextView android:layout_width="wrap_content" android:text="result" android:textappearance="?android:attr/textappearancemedium" /> <EditText android:id="@+id/resultedittext" android:editable="false" /> </LinearLayout> </LinearLayout> 13 P a g e
條件式中斷點 (3/6) 在 java/mainactivity 填入下頁程式碼, 你可能要適時地修改 package 名稱 14 P a g e
條件式中斷點 (4/6) package tw.edu.ntut.csie.test2; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.edittext; public class MainActivity extends Activity { final int[] num = new int[]{12, 42, 23, 51, 8; final int length = num.length; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); EditText edittext = (EditText) findviewbyid(r.id.initedittext); edittext.settext(convertarraytostring(num)); public void sortbuttonclick(view v) { bubblesort(num, length); EditText resultedittext = (EditText) findviewbyid(r.id.resultedittext); resultedittext.settext(convertarraytostring(num)); private String convertarraytostring(int[] num) { String result = ""; for (int i : num) { if (result.equals("")) result = i + ""; else result += ", " + i; return result; private void swap(int num[], int indexa, int indexb) { int tmp = num[indexa]; num[indexb] = num[indexa]; num[indexb] = tmp; private void bubblesort(int num[], int length) { for (int i = length - 1; i > 0; --i) { for (int j = 0; j < i; ++j) { if (num[j] > num[j + 1]) { swap(num, j, j + 1); 15 P a g e
條件式中斷點 (5/6) 執行專案發現結果有錯誤, 開始進行除錯 在 if 敘述下中斷點, 並且在中斷點按下右鍵, 輸入我們想要停下的條件 num[j]==42, 待條件成立, 程式將會暫停 16 P a g e
條件式中斷點 (6/6) 執行後我們發現是 swap 函數出了錯誤, 將程式碼修改如下 : private void swap(int num[], int indexa, int indexb) { int tmp = num[indexa]; num[indexa] = num[indexb]; num[indexb] = tmp; 成功 17 P a g e