代码质量,一个可大可小的问题。
一 规范
(1)命名
变量:mNumberOfPlayer(number_of_player)
常量:INTEM_IMAGE(intem_image,intemImage)
(2)方法
命名:采用小驼峰式
注意:
1、严格要求自己写体量小的方法,一个方法在20行左右(getter、setter一行解决),方法过大一定要分拆,比如如多 if-else里面的内容完全可以分别拆出2个单独方法
2、避免空方法(Methods should not be empty)
如果有特殊原因写了内容为空的方法,一定要有详细的注释说明原因。
3、表达式不应该太复杂(Expressions should not be too complex,maximum allowed 3)
if(edge == DragEdge.Right && childRight <= getWidth()&& childBottom <= getHeight()&& childTop >= getPaddingTop()&& childLeft >= getPaddingLeft())
4、字符串字面值不应重复(String literals should not be duplicated)
HashMapmap =newHashMap();
map.put("ItemImage", R.drawable.wb_icon_myproject);
map.put("ItemImage", R.drawable.wb_icon_myproject2);
修改为:
constant String INTEM_IMAGE="ItemImage";
map.put(INTEM_IMAGE, R.drawable.wb_icon_myproject2);
二 规避Bug
(1)java.lang.NullPointerException
空指针最为常见,也最容易规避,使用的时候一定要进行null check,采取不信任原则:
方法形参要判空后才使用;
全局变量容易被系统回收或者更改,使用全局变量前建议判空;
第三方接口的调用,对返回值进行判空。
(2)java.util.ConcurrentModificationException
异常示例:java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
异常代码示例:
mTimer.schedule(newTimerTask() {
public voidrun() {
initEleLocationData();
}},0,DELAY_TIME_InitData);
mTimer.schedule(newTimerTask() {
public void run() {
if(mEleInfoList!=null) {
for(HashMap mInfoMap :mEleInfoList) {
calculateTime(mInfoMap);}
}}},0,DELAY_TIME);
[原因分析]:该异常表示迭代器迭代过程中,迭代的对象发生了改变,如数据项增加或删除。
由于迭代对象不是线程安全,在迭代的过程中,会检查modCount是否和初始modCount即expectedModCount一致,如果不一致,则认为数据有变化,迭代终止并抛出异常。常出现的场景是,两个线程同时对集合进行操作,线程1对集合进行遍历,而线程2对集合进行增加、删除操作,此时将会发生ConcurrentModificationException异常。
具体解决方法:多线程访问时要增加同步锁,或者建议使用线程安全的集合:
1. 使用ConcurrentHashMap替换HashMap,CopyOnWriteArrayList替换ArrayList;
2. 或者使用使用Vector替换ArrayList,Vector是线程安全的。Vector的缺点:大量数据操作时,由于线程安全,性能比ArrayList低.
(3)java.lang.IllegalArgumentException: You must pass in a non null
(4)Switch "switch" statements should end with "default" clauses