JAVA && Spring && SpringBoot2.x — 學(xué)習(xí)目錄
1. Exception異常
1.1 運(yùn)行時(shí)異常
運(yùn)行時(shí)異常(unchecked
未經(jīng)檢查的異常):RuntimeException
及其子類是未經(jīng)檢查的異常 慷荔。運(yùn)行時(shí)異常的特點(diǎn)就是Java編譯期不會(huì)檢查它雕什,也就是說,當(dāng)程序中可能出現(xiàn)這類異常時(shí)显晶,既可以不使用try-catch
捕獲它贷岸,也可以不使用throws
字句聲明它,也可以編譯通過磷雇。
如下圖:
public void testRuntimeException() {
throw new RuntimeException("我并不需要捕獲或拋出");
}
1.2 檢查時(shí)異常
非運(yùn)行時(shí)異常(檢查異常):Exception
類中除RuntimeException
之外的異常偿警。從語法上是必須要進(jìn)行處理的,不然編譯不過去唯笙。如IOException
螟蒸、SQLException
等以及(敲黑板,劃重點(diǎn))用戶自定義的Exception
異常崩掘。出現(xiàn)檢查時(shí)異常七嫌。要么try-catch
捕獲它,要么throws
拋出它苞慢。
2. try-catch-finally的關(guān)系
2.1 catch里面返回诵原,會(huì)執(zhí)行finally的代碼嗎?
public static int testFinally() {
try {
int i = 1 / 0;
} catch (Exception e) {
return 1;
} finally {
System.out.println("你猜我執(zhí)行了嗎");
}
return 2;
}
public static void main(String[] args) {
System.out.println(TestObject.testFinally());
}
- 在
try-catch-finally
塊中即使含有return
,break
皮假、continue
等改變執(zhí)行流的關(guān)鍵字鞋拟,finally也會(huì)執(zhí)行骂维。 -
finally
執(zhí)行完畢惹资,便執(zhí)行catch
中的return
返回。
2.2 try-catch-finally均有返回航闺,到底返回誰褪测?
public static int testFinally() {
try {
int i = 1 / 0;
return 1;
} catch (Exception e) {
System.out.println("我是打醬油的,我會(huì)不會(huì)被輸出");
return 2;
} finally {
return 3;
}
}
因?yàn)?code>finally一定會(huì)執(zhí)行潦刃,那么最后返回的一定是finally
的return
侮措。但是只是return返回被覆蓋,需要注意的是邏輯代碼還是會(huì)執(zhí)行的乖杠。
2.3. finally里面返回分扎,catch拋出異常會(huì)執(zhí)行嗎。
可以看到胧洒,我們拋出的檢查時(shí)異常畏吓,但是并未編譯錯(cuò)誤。是不是和上面理論有沖突卫漫?
不是的菲饼!我們?cè)?code>finally中使用了return
,那么catch
里面的throw
將被忽略列赎。
運(yùn)行結(jié)果:
2.4. finally和catch均拋出異常宏悦,到底執(zhí)行誰?
可以看到包吝,均是拋出的exception異常饼煞,但是finally里面需要throws或者捕獲,那么最終還是以finally里面的代碼為準(zhǔn)的诗越。
2.5在try-finally中的值傳遞和引用傳遞(重點(diǎn))
public static int test(int x, int y) {
int result = x;
try {
result = x + y;
System.out.println("try中的結(jié)果:"+result);
//返回的基本數(shù)據(jù)類型砖瞧,在執(zhí)行finally中,其實(shí)是值傳遞
return result;
} finally {
result = x - y;
System.out.println("result中的結(jié)果:"+result);
}
}
public static void main(String[] args) {
int x = 3;
int y = 5;
int result = test(5, 3);
System.out.println(result);
}
返回結(jié)果:
是不是很驚奇2粲鳌0沤臁!
2.6總結(jié)及建議
若
try{}
中包含return
感耙,那么return時(shí)褂乍,先將返回結(jié)果記錄。再執(zhí)行finally即硼。
- 如果finally也有return逃片,則finally中的return會(huì)覆蓋try中的返回值,否則將記錄的結(jié)果返回。
- 如果finally沒有return褥实,若是修改了try{}中的返回值數(shù)據(jù)呀狼,那么return就會(huì)被修改,若是基本數(shù)據(jù)损离,那么try{ return}不會(huì)修改哥艇。
需要注意的是:Java里面是值傳遞,如果本身是基本數(shù)據(jù)類型僻澎,數(shù)據(jù)不會(huì)收到影響貌踏,如果是引用類型,數(shù)據(jù)會(huì)改變窟勃。
有點(diǎn)繞...
為了不給后來人挖坑祖乳,我們需要記住:
- 不要在finally中使用return或者拋出異常秉氧。
- 減輕finally工作量眷昆,不要在finally中做其他的事情,finally最好僅僅用來釋放資源最合適汁咏。
- 盡量不在try-catch-finally里面使用return亚斋,將其放在函數(shù)最后面。
3. 項(xiàng)目中異常處理
拋出的異常經(jīng)過try-catch處理之后梆暖,若未繼續(xù)拋出新的異常伞访,那么便像正常程序一樣繼續(xù)向下執(zhí)行。即執(zhí)行完畢try-catch不會(huì)結(jié)束程序轰驳。
異常類可保存錯(cuò)誤碼和錯(cuò)誤信息
public class BusinessException extends RuntimeException {
//繼承的頂級(jí)父類實(shí)現(xiàn)了序列化接口厚掷,子類還是需要顯示的聲明SerialVersionUID。
private static final long serialVersionUID = -3516896655779527315L;
/**
* 保存用戶錯(cuò)誤碼
*/
private String code = "";
public BusinessException() {
super();
}
public BusinessException(String message) {
super(message);
}
public BusinessException(String message, Throwable cause) {
super(message, cause);
}
public BusinessException(Throwable cause) {
super(cause);
}
public BusinessException(String code, String message) {
super(message); //調(diào)用父類的this.message=message;
this.code = code;
}
public BusinessException(String code, String message, Throwable cause) {
super(message, cause); //調(diào)用父類的構(gòu)造方法级解,減少重復(fù)代碼
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
參考:
Java異趁昂冢總結(jié)