APCSA 考試中常見的 program error

APCSA速通】03 APCSA 考試中常見的 program error

Program Error

程序中的錯誤分為(wei) 編譯錯誤(語法錯誤)、運行時錯誤(異常)以及邏輯錯誤。

  • 語法錯誤syntax error / compile error,不能轉換成計算機可以執行的代碼

  • 異常runtime error, exception,部分程序可以運行,但是會(hui) 報錯導致程序崩潰

  • 邏輯錯誤logic error不報錯,但是無法得出正確的結果

在二維數組出錯之前,可以輸出多少元素

Compile Error

compile error also calledsyntax error.

  • assign double to int variable

    inta=3.2;//compileerrorintb=(int)3.2;//rightdoublec=3;//assignmentconversion//cis3.0

  • assign length to array

  • arr.length = 10語法錯誤不能給數組的長度賦值

  • assign rows to 2darray or columns 2 2darray

    int[][]mat=newint[4][4];mat.length=10;//compileerror

  • overload

    • 兩(liang) 個(ge) 方法的參數數量不同

    • 參數的數量相同,但是類型不一致

      classA{publicintadd(intx,inty){returnx+y;}//causecompileerrorpublicintadd(intm,intn){returnx+y;}}

      因為(wei) 上麵的兩(liang) 個(ge) 方法參數類型都是兩(liang) 個(ge) 整數,編譯器認為(wei) 是兩(liang) 個(ge) 重複的方法,參數叫什麽(me) 名字不重要。

    • 【考察方式】往往是問你那些方法(構造方法或者普通方法)添加到類中回導致compile-error或者那些方法添加到類中不會(hui) 導致compile-error

  • call local variable or form parameter of other method

    classSome{publicvoida(inta){//acanonlybeusedinmethoda//scopeofaismethodlevel}publicvoidb(){intb=a;//cannotaccessafrombmethod}}

  • subclass can not find default constructor of super class

    classA{publicA(inta){}//compiledonot//generatedefaultconstructor//如果父類定義(yi) 了有參數的構造方法//編譯器不再生成沒有參數的構造方法}classBextendsA{//cannotfinddefaultconstructorofsuperclass//子類默認隱式(implict)父類沒有參數的構造方法}

  • 二維數組的遍曆,對象當作索引

    Student[][]arr2d=newStudent[2][3];for(Studentk:arr2d){System.out.println(arr2d[k]);//errorSystem.out.println(k);//right}

  • 構造對象的時候訪問了私有屬性

    classPoint{privateintx,y;publicPoint(intx,inty){}}classCircle{privatePointp;privatedoubler;publicCircle(Pointp,doubler)}//=======Criclec=newCircle();c.p=newPoint(2,3);//compileerror//cannotacessprivateinstance//variable

classA{privateintnum1,num2;publicA(intn1,intn2){num1=n1;num2=n2;}publicintsum(){returnn1+n2;//error//n1n2的作用範圍僅(jin) 限於(yu) 構造方法}}
  • 父類調用子類獨有方法

    classAnimal{}classPersonextendsAnimal{publicvoidabstractThinking(){}}//=====callmethod====Animalp=newPerson();p.abstractThinking();//causecompileerror

  • 子類類型指向父類對象Person p = new Animal(); // error

  • 返回類型不兼容

    publicvoida(){returntrue;//error,returntypenotcompatable}

Runtime Error

runtime error also calledexception.

  • 3/0causeArithmetic exception

  • NullPointerException

    • 字符串不能調用方法

      String[]arr=newString[3];//default//valueofelementisnull//elementsnotinitializedarr[0].length();//causeNulPinterError

  • bounds error

    • ArrayIndexOutOfBoundarr[arr.length]

    • ArrayListIndexOutOfBoundlist.set(list.size(), 1)

    • StringIndexOutOfBoundstr.substring(str.length(), str.length()+1)

注意:

  • String substring(int start, int end)第二個(ge) 參數可以是數組的長度

    str.substring(str.lenght());//emptystringstr.substring(1,1);//emptystring

  • ArrayListadd(int index)可以傳(chuan) 遞列表的值作為(wei) 實際參數

    list.add(list.size(),"a");//rightlist.get(list.size());//right

  • 利用enhanced for loop修改ArrayListcauseConcurrency Exception

    ArrayList<String>list=newArrayList<>();list.add("a");for(Stringstr:list){list.add("s");//causeConcurrencyexceptionlist.remove(0);//causeConcurrencyexception}

  • recursion may casueStackOverflowException

    publicvoidcount(){count();}publicvoidmethod(intn){if(n>10){return0;}else{returnmethod(n-1);}}//====callmethod====method(0);//causeStackOverflowExceptionmethod(20);//0

  • 遞歸和二維數組

    int[][]arr2d={{1,2,3,4},{5,6,7,8}};publicintsum(int[]arr2d,intr,intc){if(r!=0||c!=0){returnarr2d[r][c]+sum(arr2d,r-1,c-1);}else{returnarr2d[r][c];}}//====callmethod====sum(arr2d,1,3);//causeboundserrorexceptionsum(arr2d,0,2);sum(arr2d,-1,1)//arr2d[-1][1]negtiveindexcause//ArrayIndexOutOfBoundexception

Logic Error

  • no usethiswhen form parameter same with form parameter

    //====wrongversion====classA{privateintnum;publicA(intnum){num=num;//cannotinitializethe//instanevaraible}}//====rightversion====classA{privateintnum;publicA(intnum){this.num=num;}}classA{privateintnum;publicA(intn){num=n;}}

  • for 循環查找存不存在循環體(ti) 中出現 else

    /*serachvalueinarr*/publicbooleanhas(int[]arr,intvalue){for(inti=0;i<arr.length;i++){if(arr[i]==value){returntrue;}else//cannotusethiselse{returnfalse;//應該檢查完所有元素//都不是value後返回false}}returnfalse;}//====callmethod====int[]arr={1,0,0,0};has(arr,0);//returnfalse,wrong

  • if-else-if 隻要第一個(ge) 條件成立其餘(yu) 的不看

    intscore=99;//shouldbea;Stringgrade="";if(score>=80){grade="b";//logicerrorifscore>=90}elseif(score>=90){grade="a";}

    • elseif 多選一,隻要一個(ge) 條件滿足,其餘(yu) 的就不看了

  • if 順序執行,後麵的代碼

    intscore=99;//shouldbea;Stringgrade="";if(score>=90){grade="a";}elseif(score>=80){grade="b";//}grade="A";//logicerrorifscore<90

  • ArrayList刪除元素,部分元素被跳過

  • 遞歸導致的邏輯錯誤

    • 無限遞歸,查找元素是否存在 5

      publicbooleanfind(int[]arr,intlen){if(arr[len-1]==5){returntrue;}else{returnfind(arr,len-1);}}//====callmethod====int[]arr={1,2,3,4,5};find(arr);//returntrue;int[]arr1={0};//causeArrayIndexOutOfBounderrorfind(arr1);

      上麵的方法,如果數組中,沒有5,則一定會(hui) 報錯;有至少一個(ge) 5 則不會(hui) 報錯

    • 數組索引異常

  • 無限循環

    inti=0;while(i<arr.length){arr[i]=arr[i]*arr[i];//forgettoupdateloopvaraible//infiniteloop//needi+=1}

  • primitive can not modify

用增強 for 循環修改 primitive 數組中的值

int[]arr={1,2,3};for(intn:arr){n=n*2;}//不能把數組中的值變為(wei) 原來兩(liang) 倍

因為(wei) 增強 for 循環中循環變量中保存的是值的副本,整數、小數、boolean 傳(chuan) 遞的是值的副本。想要把數組的元素變為(wei) 原來的兩(liang) 倍,應當使用 regular for loop

【競賽報名/項目谘詢+微信:mollywei007】

上一篇

IGCSE 中文課程及難度怎麽樣?

下一篇

加拿大各省優勢&優秀大學匯總

你也可能喜歡

  • 暫無相關文章!

評論已經被關(guan) 閉。

插入圖片
返回頂部