文章目錄[隱藏]
【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/0
causeArithmetic exception
-
NullPointerException
-
字符串不能調用方法
String[]arr=newString[3];//default//valueofelementisnull//elementsnotinitializedarr[0].length();//causeNulPinterError
-
-
bounds error
-
ArrayIndexOutOfBound
arr[arr.length]
-
ArrayListIndexOutOfBound
list.set(list.size(), 1)
-
StringIndexOutOfBound
str.substring(str.length(), str.length()+1)
-
注意:
-
String substring(int start, int end)
第二個(ge) 參數可以是數組的長度str.substring(str.lenght());//emptystringstr.substring(1,1);//emptystring
-
ArrayList
的add(int index)
可以傳(chuan) 遞列表的值作為(wei) 實際參數list.add(list.size(),"a");//rightlist.get(list.size());//right
-
利用
enhanced for loop
修改ArrayList
causeConcurrency Exception
ArrayList<String>list=newArrayList<>();list.add("a");for(Stringstr:list){list.add("s");//causeConcurrencyexceptionlist.remove(0);//causeConcurrencyexception}
-
recursion may casue
StackOverflowException
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 use
this
when 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
評論已經被關(guan) 閉。