每一次犯錯,都是一次蛻變个曙;每一個bug,都是一次成長锈嫩。
- 入?yún)⑻帲瑢?shù)進(jìn)行合法性校驗垦搬;
- 使用不可靠的數(shù)據(jù)時呼寸,對該數(shù)據(jù)進(jìn)行校驗;
在入?yún)⑻幍垦兀欢ㄒ獙?shù)進(jìn)行合法性校驗等舔。且看如下代碼,看看有什么問題糟趾!
public class InitChatActionDataUtil {
public static ArrayList<String> initGridListData(String type, String remark, int isShowReserve, String doctorBed) {
ArrayList<String> gridActionList = new ArrayList();
gridActionList.add("相冊");
gridActionList.add("拍照");
gridActionList.add("表情");
if (type.equals("2")) {
//群聊慌植,生成GridView數(shù)據(jù): 相冊甚牲,拍照,表情蝶柿,紅包
gridActionList.add("紅包");
} else {
//與醫(yī)生丈钙,相冊,拍照交汤,表情雏赦,評價,(預(yù)約芙扎,加床====隨機(jī)星岗,根據(jù)傳過來數(shù)據(jù)判斷)
if (remark.equals("醫(yī)生")) {
gridActionList.add("評價");
if (isShowReserve == 2) {
gridActionList.add("預(yù)約");
if (doctorBed.equals("2")) {
gridActionList.add("加床");
}
}
}
//小瑞:相冊,拍照戒洼,表情
//個管:相冊俏橘,拍照,表情圈浇,評價寥掐,紅包
if (remark.equals("個管師")) {
gridActionList.add("評價");
gridActionList.add("紅包");
}
// 與個人:相冊,拍照磷蜀,表情召耘,紅包
if (remark.equals("患者")) {
gridActionList.add("紅包");
}
}
return gridActionList;
}
}
在上述代碼中,我通過入?yún)ⅲ?/p>
- type褐隆,傳入會話類型污它,是單聊,還是群聊妓灌;
- remark轨蛤,備注,會話對象是醫(yī)生虫埂,還是個管師祥山,還是客服,or 患者掉伏;
- doctorBed缝呕,醫(yī)生是否提供加床服務(wù);
如果斧散,入?yún)凑瘴业脑O(shè)想供常,都是正確的傳入,那么這段代碼可以正常運行鸡捐,代碼如下栈暇。
InitChatActionDataUtil.initGridListData(
"2",
"醫(yī)生",
1,
"2")
但是,如果入?yún)⒆兂扇缦逻@樣箍镜,會怎樣呢源祈?
InitChatActionDataUtil.initGridListData(
null,
null,
1,
null)
在傳入null后煎源,程序拋出異常:
reason: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx/com.xxxx.activity.ChatMessageActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2359)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2422)
at android.app.ActivityThread.access$800(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1319)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5313)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1116)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:809)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.xxxx.utils.InitChatActionDataUtil.initGridListData(InitChatActionDataUtil.java:24)
at com.xxxx.activity.ChatMessageActivity.findView(ChatMessageActivity.java:375)
at com.xxxx.activity.ChatMessageActivity.onCreate(ChatMessageActivity.java:313)
at android.app.Activity.performCreate(Activity.java:6036)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
... 10 more
可以看到結(jié)果:
java.lang.NullPointerException
因為,代碼變成了這樣:
null.equals("xxx")
至此香缺,算是清楚了手销。如果不對入?yún)⑦M(jìn)行校驗,程序會拋出異常图张。這里锋拖,只是羅列了一個極其簡單的場景。在實際開發(fā)中祸轮,這種情況非常多見兽埃。一定要對入?yún)⑦M(jìn)行校驗。
上面代碼改成倔撞,如下所示讲仰,才會比較安全:
public class InitChatActionDataUtil {
public static ArrayList<String> initGridListData(String type, String remark, int isShowReserve, String doctorBed) {
ArrayList<String> gridActionList = new ArrayList();
gridActionList.add("相冊");
gridActionList.add("拍照");
gridActionList.add("表情");
//對入?yún)⑦M(jìn)行校驗
if (type != null && remark != null && doctorBed != null) {
......
}
return gridActionList;
}
下面再看另一中情形:
我從Activity A 中傳過來兩個Extra : rubyCode 慕趴、type痪蝇。
rubyCode = getIntent().getStringExtra("rubyCode");
UIType = getIntent().getIntExtra("type", 2);
在當(dāng)前Activity B中直接使用這兩個參數(shù),會發(fā)生什么呢冕房?
if(rubyCode.equals("EXfsGSEs")){
......
}
兩種情況:
- 如果rubyCode有正常的值躏啰,程序正常運行;
- 如果傳過來的rubyCode 是 null 呢耙册? 那就慘了8!详拙!
因此帝际,在使用rubyCode之前,要做校驗:
if(rubyCode != null && rubyCode.equals("EXfsGSEs")){
......
}
上述饶辙,只是羅列了最簡單的情形蹲诀,也是我犯過的一些錯誤,這些錯誤讓我意識到:
不要相信任何東西弃揽,除了經(jīng)過自己檢驗脯爪,正確的,才可以相信矿微。