首頁技術(shù)文章正文

如何使用debug

更新時(shí)間:2018-09-18 來源:黑馬程序員JavaEE培訓(xùn)學(xué)院 瀏覽量:

一、Debug課程引言

我們?cè)趯懗绦虻臅r(shí)候,會(huì)經(jīng)常出現(xiàn)一些問題也叫bug(如程序運(yùn)行報(bào)錯(cuò),結(jié)果與預(yù)期不符等),面對(duì)這些問題,特別是對(duì)于初學(xué)者而言,會(huì)有很大的困擾,在解決問題的過程中會(huì)消耗大量的時(shí)間,因?yàn)闆]有掌握解決問題的方式。

所以我覺得有必要開發(fā)一套課來提高大家解決問題的能力,因?yàn)椴还軐?duì)于現(xiàn)在學(xué)習(xí)而言,還是對(duì)于日后的工作而言,解決bug是一個(gè)非常重要的能力。因?yàn)閎ug無處不在,可以說bug是伴隨我們開發(fā)的伴侶,只有我們能征服這些bug,才能征服開發(fā)工作。


二、Bug分類

程序中的錯(cuò)誤大致分為兩種,編譯時(shí)錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤。

1.   編譯時(shí)錯(cuò)誤

這種問題基本都是一些語法錯(cuò)誤,哪里有紅色波浪線,哪里就有問題。

a.        類名,方法名,變量名寫錯(cuò)了

b.        標(biāo)點(diǎn)符號(hào)寫錯(cuò)了

c.         括號(hào)不匹配

d.        修改了代碼,沒有保存

e.        方法中少了return語句

以上這些問題都是最最最最最最基本的語法格式問題,必須知道怎么解決,這不是我們此次課程的重點(diǎn)。


2.   運(yùn)行時(shí)錯(cuò)誤

程序運(yùn)行時(shí)出現(xiàn)的bug才是我們課程的重點(diǎn)。

程序運(yùn)行時(shí)出現(xiàn)錯(cuò)誤的原因就比較復(fù)雜了,有下面幾種情況

a. 程序不能正常執(zhí)行,報(bào)錯(cuò)(如NullPointerException)

b. 程序可以正常執(zhí)行,但結(jié)果不對(duì)


上述這些bug出現(xiàn)的原因就比較復(fù)雜,特別是那種看起來沒問題,執(zhí)行也沒報(bào)錯(cuò),但是結(jié)果就是不對(duì)的代碼,很頭疼。這個(gè)時(shí)候就需要我們用到專業(yè)的Debug工具來調(diào)試程序。


三、Debug應(yīng)用

為了讓大家能夠熟悉debug調(diào)試工具,提高解決bug的能力,在基礎(chǔ)班的各個(gè)階段分別設(shè)置一個(gè)有bug案例,用debug調(diào)試的方式來查找問題。

有句老話叫“授人以魚不如授人以漁”,通過學(xué)習(xí)這些案例,希望大家以后遇到問題首先能夠自己解決。大家畢業(yè)之后工作了,拿著別人的工資,那個(gè)時(shí)候遇到了bug,誰能幫你解決,只能自己想辦法解決。

1.   Debug案例1

//基本類型作為參數(shù)

    public static void show(int a){

       a=a+1;

    }

   

    //引用類型作為參數(shù)

    public static void show(int[] arr){

       arr[0]+=1;

    }

2.   Debug案例2

/*

     * 分析以下需求,并用代碼實(shí)現(xiàn)(循環(huán),if):

       (1)打印1到100之內(nèi)的整數(shù),但數(shù)字中包含9的要跳過

       (2)每行輸出5個(gè)滿足條件的數(shù),之間用空格分隔

       (3)如:1 2 3 4 5

     */

    public static void function3(){

       int count=0;  

       for(int i=1;i<100;i++){

           if(!(i%10==9||i/10%10==9)){

              System.out.print(i+" ");

              count++;      

           }

           

           if(count%5==0){

              System.out.println("");

           }

       }

}


執(zhí)行結(jié)果如下:在38和40之間多了一個(gè)空行

.....省略......

34 35 36 37 38


40 41 42 43 44

.....省略......

3.   Debug案例3

public class Fu {

    int a;

    public Fu() {

       a=20;

       show();

    }

    public void show(){

       System.out.println(a);

    }

}


public class Zi extends Fu{

    int a;

    public Zi() {

       a=20;

    }

    public void show(){

       System.out.println(a);

    }

    public static void main(String[]args){

       Zi z=new Zi();

       z.show();

    }

}

打印結(jié)果為:

0

20


4.   Debug案例4

下面字符串中”java”出現(xiàn)的次數(shù)

“sunjavahpjavaokjavajjavahahajavajavagoodjava”

String s ="sunjavahpjavaokjavajjavahahajavajavagoodjava";

        int count = 0;

        int index=0;

        while (s.indexOf("java") != -1) {

            index = s.indexOf("java", index);

            if (index != -1) {

                index = index + 1;

                count++;

            }

        }

        System.out.println(count);


5.   Debug案例5

public static void main(String[] args) {

      getDir(newFile("C:\\"));

}

   

    /*

     * 打印輸出指定目錄下所有的.java文件(包含子目錄)

     */

    public static void getDir(File dir){

        File[] files = dir.listFiles();

        for(File f:files){

            if(f.isDirectory()){

                getDir(f);

            }else{

                if(f.getName().endsWith(".java")){

                    System.out.println(f);

                }

            }

        }

      }

Exception in thread "main" java.lang.NullPointerException

atcn.itcast.demo1.Demo4.getDir(Demo4.java:15)

atcn.itcast.demo1.Demo4.getDir(Demo4.java:17)

atcn.itcast.demo1.Demo4.getDir(Demo4.java:17)

atcn.itcast.demo1.Demo4.main(Demo4.java:7)


本文版權(quán)歸黑馬程序員JavaEE學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:黑馬程序員JavaEE培訓(xùn)學(xué)院

首發(fā):http://java.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!