開發經驗教訓

 

(1)內存泄漏

錄像下載用C寫的,手動 malloc  申請了內存。但全文只在程序正常結束return 0 前進行了free,所有異常退出的地方竟然都沒有free!導致內存泄漏。

(2)點進行方法調用,一定要進行對象非空判斷

alrmMap.get("longitude")
public static String toStr(Object obj){
    return null == obj ? "" : obj.toString();
}

1.alrmMap如果爲null,點get就會報空指針異常,程序直接崩掉。

2.如果alrmMap.get("longitude")作爲一個入參傳遞給另外一個方法,還要對get的返回值進行判斷,如果爲null要轉爲空字符串"" 

3.調第三方的http接口獲得的返回數據時也要進行異常判斷,null判斷。

看到這麼多異常,想要找出我們常見的5中運行時異常是非常容易的。  

例如:

ClassCastException(類轉換異常)

IndexOutOfBoundsException(數組越界異常)

NullPointerException(空指針異常)

ArrayStoreException(數據存儲異常,操作數組時類型不一致)

BufferOverflowException(還有IO操作的,緩衝溢出異常)

try{

} catch (Exception|Error e) {
    throw new ErrorException(ErrorCodeMarket.MAP_CODE_0001, ErrorCodeMarket.MAP_MSG_0001);
}

(3)類中定義static靜態變量要慎重

一定要仔細思考下,此變量是否一定要定義成靜態的!

static關鍵字的特點

1.一個類中被static所修飾的成員被類的所有對象共享。

2. 隨着類的加載而加載,所有優先於對象的存在

3.可以通過類名調用

static注意事項:
1.在靜態方法中是沒有this關鍵字的
靜態是隨着類的加載而加載,this是隨着對象的創建而存在。
靜態比對象先存在。

2.靜態方法只能訪問靜態的成員變量和靜態的成員方法
靜態只能訪問靜態,非靜態可以訪問靜態的也可以訪問非靜態的。

(4)儘量不用e.printStackTrace

Java開發之log日誌的使用盡量不用e.printStackTrace

http://baijiahao.baidu.com/s?id=1639733404613101605&wfr=spider&for=pc

前言

在Java開發中,無論是運行還是調試,一般都會對異常進行處理,一則明確問題出在哪個地方,一則也是代碼完整性的一部分。談到log日誌,小編建議初學java的朋友使用框架集成的log4j、logback這類統一打印日誌,儘量不使用catch的e.printStackTrace(),爲什麼呢?下面我們來做簡單介紹。

爲什麼儘量不用e.printStackTrace

直接用e.printStackTrace來打印日誌有錯嗎?當然不錯,但是不好。主要原因有以下幾點:

1、佔用太多內存,造成鎖死

要打印字符串輸出到控制檯上,需要字符串常量池所在的內存塊有足夠的空間。然而,因爲e.printStackTrace() 語句要產生的字符串記錄的是堆棧信息,太長太多,內存被填滿了!大量線程產出字符串產出到一半,等待有內存被釋放,鎖死了,導致整個應用掛掉了。

2、日誌交錯混合,不易讀

從開始學習java,老師就教我們寫代碼要具有可讀性,易讀性。同樣,日誌的輸出如果不具有易讀性,也是讓程序員非常頭疼的一件事。那麼爲什麼e.printStackTrace輸出的日誌具有不易讀性了呢?

printStackTrace()默認使用了System.err輸出流進行輸出,與System.out是兩個不同的輸出流,那麼在打印時自然就形成了交叉。再就是輸出流是有緩衝區的,所以對於什麼時候具體輸出也形成了隨機。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章