基本规范异常
1, 尽量不要使用
try catch捕获异常,而是显式的抛出一个异常。
2, 使用
try catch 一定要在
catch语句中做好相应的处理,不能留空。
3, 不要捕获
Exception类型的异常
Java代码: privatefinalHandlermAttachmentEditorHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseAttachmentEditor.MSG_EDIT_SLIDESHOW:{
try{//'''不要使用trycatch'''
editSlideshow();
}catch(Exceptione){//不要在这里捕获基类Exception
//这里留空非常危险,一旦出错,根本找不到
}
break;
}
caseAttachmentEditor.MSG_SEND_SLIDESHOW:{
if(isPreparedForSending()){
ComposeMessageActivity.this.confirmSendMessageIfNeeded();
}
break;
}
为什么不要使用try catch?
我们应该对于如何划分异常的层次有一个理解,对于完全已知的错误,结合逻辑编写处理这种错误的代码,自己无法处理的,继续向上抛出,增加程序的鲁棒性,但是如果你根本不确定报出什么异常,请不要这样做。
为什么要声明方法抛出异常?
方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。
为什么不要捕获Exception类异常?
Exception分为两类:unchecked(RuntimeException 和 error) & checked,因为RuntimeException这种由于程序本身错误导致的异常,是程序员的问题。你catch了Exception,意味着子类RuntimeException也被catch了。
在catch中可以做什么?
1,赋默认值
2,做一些错误处理
3,抛出一个自己封装的异常类对象
在catch中不可以做什么?
1,抛出一个RuntimeException。(除非你认为你的程序除了崩掉重启别无他法,否则别这么做)
finally
finally 这个关键字很不好用,因为我们根本无法确定什么时候他会执行,是return之前还是之后?没人知道。除非你要对外部资源进行一些收尾,比如使用InputStream,你要close。否则,不要用它。
引入
1,引用顺序:android,三方按字母表,java(x) (这是一个graceful的问题)
2,引用方式:一定要引全类名,不要引用整个包。
Java代码:
importsfoo.Bar;//right
importsfoo.*;//wron
注释
新加代码要求如下:
1,CopyRight Statement,声明结束后空一行写代码(非必须)
2,每个类都要有描述注释
3,方法一定要写注释描述功能,参数,返回值,重要的变量要有注修改源码要求如下:
解释修改原因
Java代码:
/*
*Copyright(C)2010TheAndroidOpenSourceProject
*LicensedundertheApacheLicense,Version2.0(the"License");
*youmaynotusethisfileexceptincompliancewiththeLicense.
*YoumayobtainacopyoftheLicenseat
*
*http://www./licenses/LICENSE-2.0
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software
*distributedundertheLicenseisdistributedonan"ASIS"BASIS,
*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
*SeetheLicenseforthespecificlanguagegoverningpermissionsand
*limitationsundertheLicense.
*/
packageeoe.android.internal.foo;
importandroid.os.Blah;
importandroid.view.Yada;
importjava.sql.ResultSet;
importjava.sql.SQLException;
/**
*DoesXandYandprovidesanabstractionforZ.
*@authorJackyYang
*/
publicclassFoo{
...
}
方法
方法一定要短小精悍,功能专注,不要试图把一个大的功能放在一个方法中实现。
局部变量
局部变量的作用域一定要最小化,即什么时候用,什么时候声明,不要提前声明了很多变量,但是最后才用。
缩进
代码块缩进4字符,不要用tab
Java代码:
publicvoidpay(){
//这里空了4字符
}
换行缩进8字符,不要用tab
Java代码:
Instrumenti=someLongExpression(that,wouldNotFit,on,one,line)
成员变量
1,静态的变量以s开头
2,非静态,非公开变量以m开头
3,静态常量 全部大写
4,成员变量定义在类的开始,或者在使用成员变量的方法之前声
Java代码
publicclassMyClass{
publicstaticfinalintSOME_CONSTANT=42;
publicintpublicField;
privatestaticMyClasssSingleton;
intmPackagePrivate;
privateintmPrivate;
protectedintmProtected;
括号 { }
使用规则只有两种:
Java代码:
if(condition){
body();//标准
}
if(condition)body();//如果只有一条语句,也可以这样
代码行长度
代码行长度不超过100字符
注解
1,注解离方法最近
2,一般不要使用SuppressWarning,要使用的话,请加上TODO注释
Java代码:
//TODO:Thethird-partyclasscom.third.useful.Utility.rotate()needsgenerics
@SuppressWarnings("generic-cast")
List<String>blix=Utility.rotate(blax)
调试规范
Log的使用
1,在调试中,非常鼓励大家使用log查找问题,但是问题结束后,在check in之前,一定要确定你的代码注释已经关闭。
2,Log的级别要视情况而定,不要随便使用Log.e
3,代码要使用规范的TAG和调试开关,方便以后使
Java代码:
privatestaticfinalbooleanDBG=true;
privatestaticfinalStringTAG="MediaScanner";
if(DBG){
Log.d(TAG,"debuginfo");
}
测试
在正规开发中,一定要有测试的环节,android有自己一套测试的工具
Java代码:
//标准的testcase
publicclassLaunchTestextendsAndroidTestCase{
testInterceptSendSms(){//格式:testMethod_specificCase1如果没有case,那就直接写testMethod,如果没有具体方法而是测的功能,那就直接写功能名,testCompose
//但是更多的还是方法级的测试
}
//测试Activity
publicclassInterceptSendMmsextendsActivityInstrumentationTestCase2<ComposeMessageActivity>{
testInterceptSendSms(){//格式:testMethod_specificCase1如果没有case,那就直接写testMethod
}
}