Android开发入门百战经典 (程序员典藏)
上QQ阅读APP看书,第一时间看更新

2.3 Android Studio调试

编写代码很多时候都是“差强人意”,很难一次获得想要的结果,出现错误的时候需要查找错误的原因,这种查找的过程称为“程序调试”。一般来讲程序员10%的时间写代码,90%的时间都在调试,因此要认识到调试的重要性。调试的方式有多种,这里介绍最常用的两种:Logcat调试方式和断点调试方式。

2.3.1 Logcat调试

Logcat调试方式很简单,在可能出现错误的地方将变量的值打印出来,方便分析总结错误原因。

这里编写一个简单的Java程序,代码如下:

  private int calculateMultiply(int i) {
        return i * i;
      }
        int[] testInts = new int[10];
      public void test(View view) {
          int i = 0;
          while (i <10) {
             i++;
            int i2 = calculateMultiply(i);
            testInts[i-1] = i2;
         Log.d(TAG, "onCreate: " +testInts[i-1]);
         }
     }

使用while循环不断计算i*i的值并通过Log打印出来,这时查看Logcat窗口中的Log信息如图2.60所示。

图2.60 Logcat窗口中的Log信息

这里通过TAG(MainActivity)来过滤日志信息,可以看出所有的i*i都被打印出来了,根据打印的值即可初步判断是否发生错误。

2.3.2 断点调试

断点调试相对于Logcat调试要复杂一些,与Logcat显示运行后的结果相比,断点调试可以暂停程序的运行而获得运行中的结果。断点调试可以分成几个步骤,下面一一介绍。

1.添加断点

在想要调试的代码行的左边栏单击即可添加一个断点,如图2.61所示。

图2.61 添加断点

从图2.61可以看出,在i++处添加了一个断点,下面就可以单击工具栏中的调试按钮开始调试。

2.开始调试

单击工具栏中的调试按钮,如图2.62所示。

图2.62 调试按钮

此时进入调试准备阶段,查看底部的监视窗,如图2.63所示。

图2.63 调试监视窗一

图2.61中所示的test方法是按钮的单击事件监听,因此单击模拟器中的按钮触发进入调试阶段,如图2.64所示。

图2.64 调试监视窗二

由图2.64可以看出,此时由Console切换到了Debugger标签,我们可以根据窗口内的工具栏按钮或快捷键来控制程序的运行。常用的调试方式有三种(Step Over、Step Into、Step Out),下面一一介绍。

Step Over,可以控制程序向下运行一步。有两种方式可以操作,其中一种是单击工具栏中的按钮,如图2.65所示。

图2.65 Step Over按钮

当然也可以使用快捷键F8来控制,这时查看代码编辑区,如图2.66所示。

图2.66 使用快捷键F8代码调试下一步

从图2.66可以看出,此时代码已由断点处向下运行了一行(蓝色背景行)。

Step Into,这个操作可以进入到调试中遇到的方法体中。例如上面的操作中遇到了calculateMultiply方法,想要进入到这个方法体中就可以单击工具栏中的Step Into按钮,如图2.67所示。

图2.67 Step Into按钮

同样也可以使用快捷键F7进行操作,再次查看代码编辑区,如图2.68所示。

图2.68 代码调试进入方法中

从图2.68可以看出,此时代码调试运行到方法calculateMultiply中了,在程序的右边显示出了这时方法的参数i的值。

若上面的步骤中进入了一个比较繁复的方法,而我们没有耐心一步步执行到最后,可以使用Step Out按钮跳出来,如图2.69所示。

图2.69 Step Out按钮

同样可以使用Shift+F8快捷键进行操作,再次查看代码编辑区,如图2.70所示。

图2.70 代码调试-跳出方法

这时又跳到了刚才进入的地方,这时再按F8快捷键又可以向下运行了。

2.3.3 高级调试

1.变量值设置

对于有些for循环或while循环,一步步执行可能需要耗费很多时间,例如上面的while循环,我们想查看i为9时的值,若一步步执行就需要执行9遍,会比较烦,有没有比较好的方式呢?当然,我们可以设置变量的值,在监视面板中选择要改变数值的变量,右击,如图2.71所示。

图2.71 代码调试-变量值设置一

在弹出的快捷菜单中选择Set Value,输入数值,如图2.72所示。

图2.72 代码调试-变量值设置二

按Enter键即可设置成功,这时再次到代码中查看,如图2.73所示。

图2.73 代码调试-变量值设置三

可以看出,此时i变量的值已经变成了9。

2.断点跳转

一般来讲,一次调试过程可能涉及多个断点,这时就可能需要断点间跳转的功能,例如在图2.74中的程序中添加了两个断点。

图2.74 代码调试-断点跳转一

假设运行到第一个断点查看变量值之后,想迅速跳转到第二个断点,这时就可以单击调试框中的Run to Cursor按钮快速跳转,如图2.75所示。

图2.75 代码调试-断点跳转二

当然也可以通过快捷键Alt+F9来实现,如图2.76所示。

图2.76 代码调试-断点跳转三

可以看出,直接跳转到了第二个断点。

3.表达式/方法值计算

若调试的代码中有一些表达式或方法值需要计算,就需要用到Evaluate Expression功能。选中需要计算的表达式或方法,右击,在弹出的快捷菜单中选择Evaluate Expression,如图2.77所示。

图2.77 代码调试-计算表达式值一

在弹出的对话框中单击Evaluate按钮即可计算表达式的值,如图2.78所示。

图2.78 代码调试-计算表达式值二

在Result栏中显示出计算值。

4.查看所有断点

单击调试监视框左边栏的View Breakpoints即可查看所有断点,如图2.79所示。

图2.79 代码调试-查看所有断点

当然也可以使用快捷键Ctrl+Shift+F8来打开。此外,还有一个可以查看所有断点的入口,选择Run→View Breakpoints,打开查看界面,如图2.80所示。

图2.80 代码调试-查看所有断点界面

这时在左边栏中就可以看到所有的断点,在右下角还可以看到断点在代码中的位置,单击左上角的 “+”和 “-”可以添加或删除断点。

5.停止调试

不想继续调试时,单击左边栏的Stop按钮停止调试,如图2.81所示。

图2.81 代码调试-停止调试

停止后的监视窗如图2.82所示。

图2.82 代码调试-停止调试后视图