文章目录[隐藏]
【APCSA速通】03 APCSA 考试中常见的 program error
Program Error
程序中的错误分为编译错误(语法错误)、运行时错误(异常)以及逻辑错误。
-
语法错误
syntax error / compile error
,不能转换成计算机可以执行的代码 -
异常
runtime error, exception
,部分程序可以运行,但是会报错导致程序崩溃 -
逻辑错误
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
-
两个方法的参数数量不同
-
参数的数量相同,但是类型不一致
classA{publicintadd(intx,inty){returnx+y;}//causecompileerrorpublicintadd(intm,intn){returnx+y;}}
因为上面的两个方法参数类型都是两个整数,编译器认为是两个重复的方法,参数叫什么名字不重要。
-
【考察方式】往往是问你那些方法(构造方法或者普通方法)添加到类中回导致
compile-error
或者那些方法添加到类中不会导致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//如果父类定义了有参数的构造方法//编译器不再生成没有参数的构造方法}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的作用范围仅限于构造方法}}
-
父类调用子类独有方法
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)
第二个参数可以是数组的长度str.substring(str.lenght());//emptystringstr.substring(1,1);//emptystring
-
ArrayList
的add(int index)
可以传递列表的值作为实际参数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 循环查找存不存在循环体中出现 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 只要第一个条件成立其余的不看
intscore=99;//shouldbea;Stringgrade="";if(score>=80){grade="b";//logicerrorifscore>=90}elseif(score>=90){grade="a";}
-
elseif 多选一,只要一个条件满足,其余的就不看了
-
-
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
,则一定会报错;有至少一个 5 则不会报错 -
数组索引异常
-
-
无限循环
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;}//不能把数组中的值变为原来两倍
因为增强 for 循环中循环变量中保存的是值的副本,整数、小数、boolean 传递的是值的副本。想要把数组的元素变为原来的两倍,应当使用 regular for loop