開(kāi)心一笑
【一交警在開(kāi)罰單技潘,一男子叼著煙過(guò)來(lái)喊:你除了開(kāi)罰單還會(huì)干什么?
交警沒(méi)理睬千康,男子繼續(xù):有種拖走跋碛摹!
交警很憤怒拾弃,男子繼續(xù):有種拖走爸底!
交警忍無(wú)可忍拿出對(duì)講機(jī)豪椿,拖車時(shí)交 警和藹說(shuō):下午到五大隊(duì)來(lái)處理奔坟!
男子:關(guān)我鳥(niǎo)事携栋!車又不是我的!
說(shuō)完哼著小曲騎著電瓶車走了】
提出問(wèn)題
如何處理異常才能使代碼更簡(jiǎn)潔咳秉?婉支??
解決問(wèn)題
程序中進(jìn)程會(huì)出現(xiàn)異常澜建,如何優(yōu)雅處理它向挖,需要一定技巧,以下是來(lái)自《代碼整潔之道》的幾點(diǎn)總結(jié):
1)使用異常而非返回碼炕舵,這里的異常處理就是我們經(jīng)常寫(xiě)的try catch何之;
package com.hwy.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CodeCleanTest {
private Logger log = LoggerFactory.getLogger(this.getClass());
public boolean eat(){
boolean isCompleted = false;
try{
System.out.println("美味");
isCompleted = true;
}catch (Exception e){
log.info(e.getMessage());
}
return isCompleted;
}
}
2)不要返回null值:這樣的話調(diào)用者就要處理null,增加工作量幕侠;解決:拋出異车勖溃或者返回特例對(duì)象(利用Collections.emptyList());
錯(cuò)誤示例:
package com.hwy.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class CodeCleanTest {
private Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 約會(huì)
*/
public void datWithGirl(){
List<String> snacksList = buySnacks();
if(null != snacksList){
List<String> litter = eatSnacks(snacksList);
dropLitter(litter);
}
}
/**
* 買零食(事實(shí)這些注釋都是不需要晤硕,只是為了大家理解)
* @return
*/
public List<String> buySnacks(){
List<String> snacksList = new ArrayList<>();
snacksList.add("牛奶");
snacksList.add("巧克力");
snacksList.add("土豆片");
return snacksList;
}
/**
* 吃零食(事實(shí)這些注釋都是不需要悼潭,只是為了大家理解)
* @param snacks
*/
public List<String> eatSnacks(List<String> snacks){
if(null != snacks) {
for (String snack : snacks) {
System.out.println("一起吃" + snack);
}
}
return snacks;
}
/**
* 仍垃圾(事實(shí)這些注釋都是不需要,只是為了大家理解)
* @param litter
*/
public void dropLitter(List<String> litter){
if(null != litter){
for(String snack:litter){
System.out.println("一起吃" + snack);
}
}
}
}
正確示例:可看里面詳細(xì)的注釋舞箍,要有耐心哦舰褪!
package com.hwy.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class CodeCleanTest {
private Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 約會(huì)
*/
public void datWithGirl() throws Exception {
List<String> snacksList = buySnacks();
/** 利用逆向思維,拋出一個(gè)業(yè)務(wù)異常疏橄,這里我只是用簡(jiǎn)單的exception代替 **/
if(null == snacksList || snacksList.size() ==0){
throw new Exception("你沒(méi)買到零食或買到的零食有問(wèn)題占拍,請(qǐng)檢查!");
}
/** 代碼執(zhí)行到這一步就說(shuō)明snacksList不為null捎迫,之后的所有
* 操作都不用判斷snacksList是否為空 **/
List<String> litter = eatSnacks(snacksList);
dropLitter(litter);
}
/**
* 買零食(事實(shí)這些注釋都是不需要晃酒,只是為了大家理解)
* @return
*/
public List<String> buySnacks(){
List<String> snacksList = new ArrayList<>();
snacksList.add("牛奶");
snacksList.add("巧克力");
snacksList.add("土豆片");
/** 在這里如果snacksList為空的話,可以用Collections.emptyList(),就不用
** 在上面處理異常了 **/
//return Collections.emptyList()窄绒;
return snacksList;
}
/**
* 吃零食(事實(shí)這些注釋都是不需要贝次,只是為了大家理解)
* @param snacks
*/
public List<String> eatSnacks(List<String> snacks){
for (String snack : snacks) {
System.out.println("一起吃" + snack);
}
return snacks;
}
/**
* 仍垃圾(事實(shí)這些注釋都是不需要,只是為了大家理解)
* @param litter
*/
public void dropLitter(List<String> litter){
for(String snack:litter){
System.out.println("扔掉垃圾:" + snack);
}
}
}
3)在方法中返回null值是很糟糕的彰导,但講null傳遞給其他方法就更糟糕了蛔翅,具體解決方法如下:
package com.hwy.test;
import org.junit.Assert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class CodeCleanTest {
private Logger log = LoggerFactory.getLogger(this.getClass());
public static void main(String[] args) throws Exception {
datWithGirl();
}
/**
* 約會(huì)
*/
public static void datWithGirl(){
/** 這里返回為null **/
List<String> snacksList = buySnacks();
/** 在吃零食方法中,需要處理異常 **/
List<String> litter = eatSnacks(snacksList);
dropLitter(litter);
}
/**
* 買零食(事實(shí)這些注釋都是不需要位谋,只是為了大家理解)
* @return
*/
public static List<String> buySnacks(){
return null;
}
/**
* 吃零食(事實(shí)這些注釋都是不需要山析,只是為了大家理解)
* @param snacks
*/
public static List<String> eatSnacks(List<String> snacks){
/** 第一種處理方法 **/
// if(null == snacks){
// throw new NullPointerException("沒(méi)有零食吃!!!");
// }
/** 第二種處理方法, **/
Assert.assertNotNull("沒(méi)有零食吃!!!",snacks);
for (String snack : snacks) {
System.out.println("一起吃" + snack);
}
return snacks;
}
/**
* 仍垃圾(事實(shí)這些注釋都是不需要,只是為了大家理解)
* @param litter
*/
public static void dropLitter(List<String> litter){
for(String snack:litter){
System.out.println("一起吃" + snack);
}
}
}
運(yùn)行結(jié)果:
java.lang.AssertionError: 沒(méi)有零食吃!!!
at org.junit.Assert.fail(Assert.java:93)
at org.junit.Assert.assertTrue(Assert.java:43)
at org.junit.Assert.assertNotNull(Assert.java:526)
at com.hwy.test.CodeCleanTest.eatSnacks(CodeCleanTest.java:48)
at com.hwy.test.CodeCleanTest.datWithGirl(CodeCleanTest.java:23)
at com.hwy.test.CodeCleanTest.main(CodeCleanTest.java:13)
4)不管做哪種類型的應(yīng)用掏父,都應(yīng)該盡可能向用戶隱藏異常的發(fā)生笋轨,除非發(fā)生了不可挽救的狀況,這才是符合最小驚訝原則的設(shè)計(jì)
5)異常的信息應(yīng)該足夠充分(包含出錯(cuò)的位置以及原因)
6)避免使用可控異常(checked exception):因?yàn)樘幚硭鼈冃枰薷暮瘮?shù)頭(在每個(gè)調(diào)用該函數(shù)的函數(shù)添加throw Exception),違反了開(kāi)放-閉合原則翩腐;應(yīng)該使用不可控異常(runtime exception);
讀書(shū)感悟
來(lái)自《峰與谷》
- 在我們的工作和生活中鸟款,每個(gè)人都會(huì)遭遇高峰和低谷,這是人生的常態(tài)茂卦。
- 看著你所失去的何什,你就會(huì)跌入不幸的谷底;看著你所擁有的等龙,你就會(huì)處在幸福的高峰处渣。
- 征服內(nèi)心的恐懼,就意味著你處在人生的高峰狀態(tài)蛛砰。
- 上天之所以制造苦難罐栈,是為了喚醒你的覺(jué)知——要關(guān)注那些被你忽視的真相。
- 通過(guò)制訂愿景來(lái)攀登高峰是一個(gè)好辦法泥畅。它能夠讓你產(chǎn)生一種渴望荠诬,并且愿意用自己的行動(dòng)把愿景變成現(xiàn)實(shí)。
- 從高峰上迅速跌落低谷的原因位仁,往往是不了解真相的驕傲自滿柑贞;在低谷里無(wú)法重新振作的原因,往往是不了解真相的憂慮恐懼聂抢。
- 高峰和低谷不僅是外部的順境和逆境钧嘶,更是你內(nèi)心深處的感覺(jué)和變化。
- 每一個(gè)人選擇好心態(tài)的時(shí)候琳疏,就意味著他將要離開(kāi)人生的谷底有决。
- 人生的高原期是用來(lái)休養(yǎng)生息、深思熟慮和自我更新的時(shí)期空盼。
- 峰谷相連不分书幕。今日順境之錯(cuò),換得他日逆境揽趾;今日逆境之智台汇,換得他日順境。
其他
如果有帶給你一絲絲小快樂(lè)但骨,就讓快樂(lè)繼續(xù)傳遞下去励七,歡迎轉(zhuǎn)載智袭,點(diǎn)贊奔缠,頂,歡迎留下寶貴的意見(jiàn)吼野,多謝支持校哎!