Java常犯5個錯!
Java 開發中常見的 5 個錯誤,與君共「免」。
以下為譯文:
1.Null 的過度使用
避免過度使用 null 值是一個最佳實踐。例如,更好的做法是讓方法返回空的 array 或者 collection 而不是 null 值,因為這樣可以防止程序拋出 NullPointerException。下面代碼片段會從另一個方法獲得一個集合:
List accountIds = person.getAccountIds();
processAccount(accountId);
}
當一個 person 沒有 account 的時候,getAccountIds() 將返回 null 值,程序就會拋出 NullPointerException 異常。因此需要加入空檢查來解決這個問題。如果將返回的 null 值替換成一個空的 list,那麼 NullPointerException 也不會出現。而且,因為我們不再需要對變數 accountId 做空檢查,代碼將變得更加簡潔。
當你想避免null值的時候,不同場景可能採取不同做法。其中一個方法就是使用 Optional 類型,它既可以是一個空對象,也可以是一些值的封裝。
Optional optionalString = Optional.ofNullable(nullableString);
if(optionalString.isPresent()) {
}
事實上,Java8 提供了一個更簡潔的方法:
Optional optionalString = Optional.ofNullable(nullableString);
optionalString.ifPresent(System.out::println);
Java 是從 Java8 版本開始支持 Optional 類型,但是它在函數式編程世界早已廣為人知。在此之前,它已經在 Google Guava 中針對 Java 的早期版本被使用。
2.忽視異常
我們經常對異常置之不理。然而,針對初學者和有經驗的 Java 程序員,最佳實踐仍是處理它們。異常拋出通常是帶有目的性的,因此在大多數情況下需要記錄引起異常的事件。別小看這件事,如果必要的話,你可以重新拋出它,在一個對話框中將錯誤信息展示給用戶或者將錯誤信息記錄在日誌中。至少,為了讓其它開發者知曉前因後果,你應該解釋為什麼沒有處理這個異常。
selfie = person.shootASelfie();
try {
selfie.show();
} catch (NullPointerException e) {
// Maybe, invisible man. Who cares, anyway?
}
強調某個異常不重要的一個簡便途徑就是將此信息作為異常的變數名,像這樣:
try { selfie.delete(); } catch (NullPointerException unimportant) { }
3.並發修改異常
這種異常發生在集合對象被修改,同時又沒有使用 iterator 對象提供的方法去更新集合中的內容。例如,這裡有一個 hats 列表,並想刪除其中所有含 ear flaps 的值:
List hats = new ArrayList();
hats.add(new Ushanka()); // that one has ear flaps
hats.add(new Fedora());
hats.add(new Sombrero());
for (IHat hat : hats) {
if (hat.hasEarFlaps()) {
hats.remove(hat);
}
}
如果運行此代碼,ConcurrentModificationException 將會被拋出,因為代碼在遍歷這個集合的同時對其進行修改。當多個進程作用於同一列表,在其中一個進程遍歷列表時,另一個進程試圖修改列表內容,同樣的異常也可能會出現。
在多線程中並發修改集合內容是非常常見的,因此需要使用並發編程中常用的方法進行處理,例如同步鎖、對於並發修改採用特殊的集合等等。Java 在單線程和多線程情況下解決這個問題有微小的差別。
收集對象並在另一個循環中刪除它們
直接的解決方案是將帶有 ear flaps 的hats 放進一個 list,之後用另一個循環刪除它。不過這需要一個額外的集合來存放將要被刪除的 hats。
List hatsToRemove = new LinkedList();
for (IHat hat : hats) {
if (hat.hasEarFlaps()) {
hatsToRemove.add(hat);
}
}
for (IHat hat : hatsToRemove) {
hats.remove(hat);
}
5.使用原始類型而不是參數化的
根據 Java 文檔描述:原始類型要麼是非參數化的,要麼是類 R 的(同時也是非繼承 R 父類或者父介面的)非靜態成員。在 Java 泛型被引入之前,並沒有原始類型的替代類型。Java 從1.5版本開始支持泛型編程,毫無疑問這是一個重要的功能提升。然而,由於向後兼容的原因,這裡存在一個陷阱可能會破壞整個類型系統。
點擊展開全文
※Java的設計模式-備忘錄模式
※JAVA初學者必須掌握的30個基本概念
※程序員是如何被外行給逼瘋的……
TAG:java學習吧 |
※初級Pythoner常犯的7個錯誤
※寫開發信常犯的錯誤有哪些?14個常見的開發信cold email錯誤
※盤點那些年運營Facebook常犯的錯誤!
※盤點:出口電商賣家常犯的10個Facebook廣告運營錯誤
※Python 初學者常犯的5個錯誤,布爾型竟是整型的子類
※Sela老師護膚課堂:洗頭常犯的6個錯,怪不得你一直在掉發
※Python初學者常犯的簡單錯誤集合與練習
※11.21 練瑜伽最常犯的3個錯誤,大部分人都做過!
※瑜伽練習最常犯的這14個錯誤,你100%犯過!
※服嗎丁啉常犯4個錯,你中招了沒有
※吃紅薯常見的6個致命錯誤,第1個你就常犯!
※減肥常犯的 12 個錯誤,瘦不下去怪你嘍!
※初次裝修經常犯的10個錯誤,90%的人都中槍了!
※瑜伽練習常犯的這11個錯誤,你應該犯過!
※養狗常犯的10個錯誤,你有沒有做過呢?
※瑜伽練習最常犯的這10大錯誤,你100%犯過!
※追妹子時男生常犯的10個錯誤
※喝牛奶常犯的8個錯誤 你中招了嗎!
※追女孩最常犯的6個錯誤,超過3個,就放棄吧
※裝過三套房總結了8條常犯錯誤,給我100個膽子都不會犯了!