為什么不要使用try catch?
我們應該對于如何劃分異常的層次有一個(gè)理解,對于完全已知的錯誤,結合邏輯編寫(xiě)處理這種錯誤的代碼,自己無(wú)法處理的,繼續向上拋出,增加程序的魯棒性,但是如果你根本不確定報出什么異常,請不要這樣做。
為什么要聲明方法拋出異常?
方法是否拋出異常與方法返回值的類(lèi)型一樣重要。假設方法拋出異常確沒(méi)有聲明該方法將拋出異常,那么客戶(hù)程序員可以調用這個(gè)方法而且不用編寫(xiě)處理異常的代碼。那么,一旦出現異常,那么這個(gè)異常就沒(méi)有合適的異??刂破鱽?lái)解決。
為什么不要捕獲Exception類(lèi)異常?
Exception分為兩類(lèi):unchecked(RuntimeException 和 error) & checked,因為RuntimeException這種由于程序本身錯誤導致的異常,是程序員的問(wèn)題。你catch了Exception,意味著(zhù)子類(lèi)RuntimeException也被catch了。
在catch中可以做什么?
1,賦默認值
2,做一些錯誤處理
3,拋出一個(gè)自己封裝的異常類(lèi)對象
在catch中不可以做什么?
1,拋出一個(gè)RuntimeException。(除非你認為你的程序除了崩掉重啟別無(wú)他法,否則別這么做)
finally
finally 這個(gè)關(guān)鍵字很不好用,因為我們根本無(wú)法確定什么時(shí)候他會(huì )執行,是return之前還是之后?沒(méi)人知道。除非你要對外部資源進(jìn)行一些收尾,比如使用InputStream,你要close。否則,不要用它。
引入
1,引用順序:android,三方按字母表,java(x) (這是一個(gè)graceful的問(wèn)題)
2,引用方式:一定要引全類(lèi)名,不要引用整個(gè)包。
Java代碼:
importsfoo.Bar;//right
importsfoo.*;//wron
注釋
新加代碼要求如下:
1,CopyRight Statement,聲明結束后空一行寫(xiě)代碼(非必須)
2,每個(gè)類(lèi)都要有描述注釋
3,方法一定要寫(xiě)注釋描述功能,參數,返回值,重要的變量要有注修改源碼要求如下:
解釋修改原因
Java代碼:
/*
*Copyright(C)2010TheAndroidOpenSourceProject
*LicensedundertheApacheLicense,Version2.0(the"License");
*youmaynotusethisfileexceptincompliancewiththeLicense.
*YoumayobtainacopyoftheLicenseat
*
*http://www.apache.org/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{
...
}
方法
方法一定要短小精悍,功能專(zhuān)注,不要試圖把一個(gè)大的功能放在一個(gè)方法中實(shí)現。
局部變量
局部變量的作用域一定要最小化,即什么時(shí)候用,什么時(shí)候聲明,不要提前聲明了很多變量,但是最后才用。
縮進(jìn)
代碼塊縮進(jìn)4字符,不要用tab
Java代碼:
publicvoidpay(){
//這里空了4字符
}
換行縮進(jìn)8字符,不要用tab
Java代碼:
Instrumenti=someLongExpression(that,wouldNotFit,on,one,line)
成員變量
1,靜態(tài)的變量以s開(kāi)頭
2,非靜態(tài),非公開(kāi)變量以m開(kāi)頭
3,靜態(tài)常量 全部大寫(xiě)
4,成員變量定義在類(lèi)的開(kāi)始,或者在使用成員變量的方法之前聲
Java代碼
publicclassMyClass{
publicstaticfinalintSOME_CONSTANT=42;
publicintpublicField;
privatestaticMyClasssSingleton;
intmPackagePrivate;
privateintmPrivate;
protectedintmProtected;
括號 { }
使用規則只有兩種:
Java代碼:
if(condition){
body();//標準
}
if(condition)body();//如果只有一條語(yǔ)句,也可以這樣
代碼行長(cháng)度
代碼行長(cháng)度不超過(guò)100字符
注解
1,注解離方法最近
2,一般不要使用SuppressWarning,要使用的話(huà),請加上TODO注釋
Java代碼:
//TODO:Thethird-partyclasscom.third.useful.Utility.rotate()needsgenerics
@SuppressWarnings("generic-cast")
List<String>blix=Utility.rotate(blax)
調試規范
Log的使用
1,在調試中,非常鼓勵大家使用log查找問(wèn)題,但是問(wèn)題結束后,在check in之前,一定要確定你的代碼注釋已經(jīng)關(guān)閉。
2,Log的級別要視情況而定,不要隨便使用Log.e
3,代碼要使用規范的TAG和調試開(kāi)關(guān),方便以后使
Java代碼:
privatestaticfinalbooleanDBG=true;
privatestaticfinalStringTAG="MediaScanner";
if(DBG){
Log.d(TAG,"debuginfo");
}
測試
在正規開(kāi)發(fā)中,一定要有測試的環(huán)節,android有自己一套測試的工具
Java代碼:
//標準的testcase
publicclassLaunchTestextendsAndroidTestCase{
testInterceptSendSms(){//格式:testMethod_specificCase1如果沒(méi)有case,那就直接寫(xiě)testMethod,如果沒(méi)有具體方法而是測的功能,那就直接寫(xiě)功能名,testCompose
//但是更多的還是方法級的測試
}
//測試Activity
publicclassInterceptSendMmsextendsActivityInstrumentationTestCase2<ComposeMessageActivity>{
testInterceptSendSms(){//格式:testMethod_specificCase1如果沒(méi)有case,那就直接寫(xiě)testMethod
}
}
聯(lián)系客服