(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是兩個不同的輸出流,那麼在打印時自然就形成了交叉。再就是輸出流是有緩衝區的,所以對於什麼時候具體輸出也形成了隨機。