全面了解java異常
異常的概念
異常,在程序中的意思是:程序在執(zhí)行過(guò)程中,出現(xiàn)的非正常的情況,最終會(huì)導(dǎo)致JVM的非正常停止。
Java的異常機(jī)制主要依賴于try、catch、finally、throw和throws五個(gè)關(guān)鍵字
其中try關(guān)鍵字后面緊跟著一個(gè)花括號(hào)括起來(lái)的代碼塊,它里面放置可能會(huì)引發(fā)異常的代碼塊。catch后面對(duì)應(yīng)異常類型和一個(gè)代碼塊,用于表明該catch塊用于處理這種異常類型的代碼塊,多個(gè)catch塊后面還可以跟一個(gè)finally塊,用于回收在try塊里打開(kāi)的物理資源,異常機(jī)制會(huì)保證finally塊一定被執(zhí)行。
throws關(guān)鍵字主要在方法簽名中使用,用于聲明該方法可能拋出的異常;
而throw用于拋出一個(gè)實(shí)際的異常,throw可以單獨(dú)作為語(yǔ)句使用,拋出一個(gè)具體的異常對(duì)象。
在Java等面向?qū)ο蟮木幊陶Z(yǔ)言中,異常本身是一個(gè)類,產(chǎn)生異常就是創(chuàng)建并拋出了一個(gè)異常對(duì)象。Java處理異常的方式是中斷處理。異常指的并不是語(yǔ)法錯(cuò)誤,語(yǔ)法錯(cuò)了編譯不能通過(guò),不會(huì)產(chǎn)生字節(jié)碼文件,根本不能運(yùn)行。
異常體系
Error:嚴(yán)重錯(cuò)誤Error,無(wú)法通過(guò)處理的錯(cuò)誤,只能事先避免,比如內(nèi)存溢出。
Exception:表示異常,異常產(chǎn)生后程序員可以通過(guò)代碼的方式糾正,使程序繼續(xù)運(yùn)行,是必須要處理的
異常的分類
我們平常說(shuō)的異常就是指Exception,因?yàn)檫@類異常一旦出現(xiàn),我們就要對(duì)代碼進(jìn)行更正,修復(fù)程序。
異常(Exception)的分類:根據(jù)在編譯時(shí)期還是運(yùn)行時(shí)期去檢查異常。
編譯時(shí)期異常:checked異常。在編譯時(shí)期就會(huì)檢查,如果沒(méi)有處理異常,則編譯失敗。(如日期格式化異常)運(yùn)行時(shí)期異常:
runtime異常。在運(yùn)行時(shí)期,檢查異常。在編譯時(shí)期,運(yùn)行期異常不會(huì)被編譯器檢測(cè)(不報(bào)錯(cuò))。(如數(shù)學(xué)異常)
異常產(chǎn)生的過(guò)程分析
1.JVM(java virtual machine)會(huì)檢測(cè)出程序出現(xiàn)的異常,JVM會(huì)做兩件事情。
1).JVM會(huì)根據(jù)異常產(chǎn)生的原因創(chuàng)建一個(gè)異常對(duì)象,這個(gè)異常對(duì)象包含了異常產(chǎn)生的(內(nèi)容,原因,位置)。
2).在方法中,沒(méi)有異常處理的邏輯(try-catch),那么JVM就會(huì)把異常對(duì)象拋出給方法的調(diào)用者main方法來(lái)處理這個(gè)異常.
2.MAIN方法接受到這個(gè)異常對(duì)象,MAIN方法也沒(méi)有異常的處理邏輯,繼續(xù)把對(duì)象拋出給MAIN方法的調(diào)用者JVM處理(MAIN方法把異常對(duì)象拋出給JVM)
3.JVM接受到這個(gè)異常對(duì)象,做了兩件事情。
1).把異常對(duì)象(內(nèi)容,原因,位置)以紅色的字體打印在控制臺(tái)
2).JVM會(huì)終止當(dāng)前正在執(zhí)行的java程序 à中斷處理
異常的處理
Java異常處理的五個(gè)關(guān)鍵字:try、catch、finally、throw、throws。
拋出異常throw
在編寫程序時(shí),我們必須要考慮程序出現(xiàn)問(wèn)題的情況。比如,在定義方法時(shí),方法需要接受參數(shù)。那么,當(dāng)調(diào)用方法使用接受到的參數(shù)時(shí),首先需要先對(duì)參數(shù)數(shù)據(jù)進(jìn)行合法的判斷,數(shù)據(jù)若不合法,就應(yīng)該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進(jìn)來(lái)。這時(shí)需要使用拋出異常的方式來(lái)告訴調(diào)用者。
在java中,提供了一個(gè)throw關(guān)鍵字,它用來(lái)拋出一個(gè)指定的異常對(duì)象。那么,拋出一個(gè)異常具體如何操作呢?
1.創(chuàng)建一個(gè)異常對(duì)象。封裝一些提示信息(信息可以自己編寫)。
2.需要將這個(gè)異常對(duì)象告知給調(diào)用者。怎么告知呢?怎么將這個(gè)異常對(duì)象傳遞到調(diào)用者處呢?通過(guò)關(guān)鍵字throw就可以完成。
throw用在方法內(nèi),用來(lái)拋出一個(gè)異常對(duì)象,將這個(gè)異常對(duì)象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。
格式
throw new 異常類名(參數(shù)); //例: public class ThrowDemo{ public static void main(String[]args){ //創(chuàng)建一個(gè)數(shù)組 int[]arr={9,5,2,7}; //根據(jù)索引找對(duì)應(yīng)元素 int index = 4; int element = getElement(arr,index); System.out.println(element); System.out.println("over!"); } public static int getElement(int arr[],int index){ //判斷索引是否越界 if(index<0||index>arr.length-1){ /* *判斷條件如果滿足,當(dāng)執(zhí)行完throw拋出異常對(duì)象后,方法已經(jīng)無(wú)法繼續(xù)運(yùn)算. *這時(shí)就會(huì)結(jié)束當(dāng)前方法的執(zhí)行,并將異常告知給調(diào)用者,這時(shí)就需要通過(guò)異常來(lái)解決. */ throw new ArrayIndexOutOfBoundsException("哥們,角標(biāo)越界了!!!"); } int element=arr[index]; return element; } }
注意:如果產(chǎn)生了問(wèn)題,我們就會(huì)throw將問(wèn)題描述類即異常進(jìn)行拋出,也就是將問(wèn)題返回給該方法的調(diào)用者。
那么對(duì)于調(diào)用者來(lái)說(shuō),該怎么處理呢?一種是進(jìn)行捕獲處理,另一種就是繼續(xù)講問(wèn)題聲明出去,使用throws聲明處理。
聲明異常throws
聲明異常:將問(wèn)題標(biāo)識(shí)出來(lái),報(bào)告給調(diào)用者。如果方法內(nèi)通過(guò)throw拋出了編譯時(shí)異常,而沒(méi)有捕獲處理(稍后講解該方式),那么必須通過(guò)throws進(jìn)行聲明,讓調(diào)用者去處理。
關(guān)鍵字throws運(yùn)用于方法聲明之上,用于表示當(dāng)前方法不處理異常,而是提醒該方法的調(diào)用者來(lái)處理異常(拋出異常)
聲明異常格式:
修飾符 返回值類型 方法名 (參數(shù)列表) throws 異常類名1,異常類名2... { } //示例代碼 public class ThrowsDemo{ public static void main(String[]args) throws FileNotFoundException { read("a.txt"); } //定義功能時(shí)有問(wèn)題發(fā)生需要報(bào)告給調(diào)用者.可以通過(guò)在方法上使用throws關(guān)鍵字進(jìn)行聲明 public static void read(String path) throws FileNotFoundException{ if(!path.equals("a.txt")){ //如果不是a.txt就認(rèn)為文件不存在是一個(gè)異常拋出問(wèn)題! throw new FileNotFoundException("文件不存在"); } } }
throws用于進(jìn)行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個(gè)異常類,用逗號(hào)隔開(kāi)。
public class ThrowsDemo2 { public static void main(String[]args) throwsIOException { read("a.txt"); } //定義功能時(shí)有問(wèn)題發(fā)生需要報(bào)告給調(diào)用者.可以通過(guò)在方法上使用throws關(guān)鍵字進(jìn)行聲明 public static void read(String path) throws FileNotFoundException , IOException { if(!path.equals("a.txt")) { //如果不是a.txt就認(rèn)為文件不存在是一個(gè)異常拋出問(wèn)題! throw new FileNotFoundException("文件不存在"); } if(!path.equals("b.txt")){ throw new IOException(); } } }
捕獲異常try…catch
如果異常出現(xiàn)的話,會(huì)立刻終止程序,所以我們得處理異常:
1.該方法不處理,而是聲明拋出,由該方法的調(diào)用者來(lái)處理(throws)。
2.在方法中使用try-catch的語(yǔ)句塊來(lái)處理異常。
try-catch的方式就是捕獲異常。
捕獲異常:Java中對(duì)異常有針對(duì)性的語(yǔ)句進(jìn)行捕獲,可以對(duì)出現(xiàn)的異常進(jìn)行指定方式的處理。
捕獲異常語(yǔ)法
try { 編寫可能會(huì)出現(xiàn)異常的代碼 }catch(異常類型 e){ 處理異常的代碼 //記錄日志/打印異常信息/繼續(xù)拋出異常 }
try:該代碼塊中編寫可能產(chǎn)生異常的代碼。
catch:用來(lái)進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。
注意:
try和catch都不能單獨(dú)使用,必須連用。
try里面還可以有try…catch
示例代碼:
public class TryCatchDemo { public static void main (String[]args) { try {//當(dāng)產(chǎn)生異常時(shí),必須有處理方式,要么捕獲要么聲明 read("a.txt"); }catch(FileNotFoundException e){//try中拋出什么異常,括號(hào)中就定義什么類型 System.out.println(e); } System.out.println("OVER!"); } //定義功能時(shí)有問(wèn)題發(fā)生需要報(bào)告給調(diào)用者.可以通過(guò)在方法上使用throws關(guān)鍵字進(jìn)行聲明 public static void read (String path) throws FileNotFoundException { if(!path.equals("a.txt")){ //如果不是a.txt就認(rèn)為文件不存在是一個(gè)異常拋出問(wèn)題! throw new FileNotFoundException("文件不存在"); } } }
如何獲取異常信息:
Throwable類中定義了一些查看方法:
public String getMessage():獲取異常的描述信息,原因(提示給用戶的時(shí)候,就提示錯(cuò)誤原因。
public String toString():獲取異常的類型和異常描述信息(不用)。
public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺(tái)。包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開(kāi)發(fā)和調(diào)試階段,都得使用printStackTrace。
示例代碼:
public static void main(String[]args){ try { String str=null; System.out.println(str.length()); }catch(Exceptione){ e.printStackTrace();//打印異常的堆棧追蹤信息 } System.out.println("OVER!"); } //運(yùn)行結(jié)果: java.lang.NullPointerException at com.langsin.exception.ExceptionDemo.main(ExceptionDemo.java:7) OVER!
finally代碼塊
finally:有一些特定的代碼無(wú)論異常是否發(fā)生,都需要執(zhí)行。另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語(yǔ)句執(zhí)行不到。而finally就是解決這個(gè)問(wèn)題的,在finally代碼塊中存放的代碼都是一定會(huì)被執(zhí)行的。
什么時(shí)候的代碼必須最終執(zhí)行?
當(dāng)我們?cè)趖ry語(yǔ)句塊中打開(kāi)了一些物理資源(磁盤文件/網(wǎng)絡(luò)連接/數(shù)據(jù)庫(kù)連接等),我們都得在使用完之后,最終關(guān)閉打開(kāi)的資源。
注意:finally不能單獨(dú)使用。
比如在我們之后學(xué)習(xí)的IO流中,當(dāng)打開(kāi)了一個(gè)關(guān)聯(lián)文件的資源,最后程序不管結(jié)果如何,都需要把這個(gè)資源關(guān)閉掉。
try catch 語(yǔ)句中有return 的各類情況
首先給出一道題目:
下面代碼的運(yùn)行結(jié)果為?
public class test { public int add(int a,int b) { try { return a+b; }catch(Exception e){ System.out.println("catch語(yǔ)句塊"); }finally { System.out.println("finally語(yǔ)句塊"); } return 0; } public static void main(String[] args) { test t=new test(); System.out.println("和是"+t.add(9, 34)); } }
A、catch語(yǔ)句塊 和是43
B、編譯異常
C、finally語(yǔ)句塊 和是43
D、和是43 finally語(yǔ)句塊
正確答案:C
由于學(xué)習(xí)過(guò)編譯原理的課程,知道了System.out.println中要執(zhí)行add()方法與前面的“和是”字符串拼接后才會(huì)輸出,因此首先執(zhí)行add()方法。
add()方法中try語(yǔ)句塊中有return語(yǔ)句,那么是否執(zhí)行完try語(yǔ)句塊就直接退出方法了呢?
上述代碼在Eclipse下運(yùn)行此代碼結(jié)果為:
看來(lái)盡管try語(yǔ)句塊中有return,還是會(huì)執(zhí)行finally語(yǔ)句塊。
看到了合理的解釋是,在try中執(zhí)行到return語(yǔ)句時(shí),不會(huì)真正的return,即只是會(huì)計(jì)算return中的表達(dá)式(本題為執(zhí)行a+b),之后將結(jié)果保存在一個(gè)臨時(shí)棧中,接著執(zhí)行finally中的語(yǔ)句,最后才會(huì)從臨時(shí)棧中取出之前的結(jié)果返回。
下面我們?cè)谶@道題的finally語(yǔ)句中加入這么一行代碼:
a=1;
public class test { public int add(int a,int b) { try { return a+b; }catch(Exception e){ System.out.println("catch語(yǔ)句塊"); }finally { System.out.println("finally語(yǔ)句塊"); a=1; } return 0; } public static void main(String[] args) { test t=new test(); System.out.println("和是"+t.add(9, 34)); } }
下面是運(yùn)行結(jié)果截圖:
從結(jié)果看出來(lái)結(jié)果并沒(méi)有發(fā)生改變,這也驗(yàn)證了finally中的語(yǔ)句不會(huì)影響到臨時(shí)棧中的值,即在執(zhí)行finally之前,臨時(shí)棧中的值已經(jīng)確定為43了,執(zhí)行finally語(yǔ)句將a的值變?yōu)?,對(duì)結(jié)果沒(méi)有產(chǎn)生影響,執(zhí)行完finally后的輸出結(jié)果仍為43.
finally塊中的內(nèi)容會(huì)先于try中的return語(yǔ)句執(zhí)行,如果finall語(yǔ)句塊中也有return語(yǔ)句的話,那么直接從finally中返回了,這也是不建議在finally中return的原因。下面來(lái)看這幾種情況。
情況一(try中有return,finally中沒(méi)有return):
public class TryTest{ public static void main(String[] args){ System.out.println(test()); } private static int test(){ int num = 10; try{ System.out.println("try"); return num += 80; }catch(Exception e){ System.out.println("error"); }finally{ if (num > 20){ System.out.println("num>20 : " + num); } System.out.println("finally"); } return num; } }
輸出結(jié)果如下:
try
num>20 : 90
finally
90
分析:顯然“return num += 80”被拆分成了“num = num+80”和“return num”兩個(gè)語(yǔ)句,線執(zhí)行try中的“num = num+80”語(yǔ)句,將其保存起來(lái),在try中的”return num“執(zhí)行前,先將finally中的語(yǔ)句執(zhí)行完,而后再將90返回。
情況二(try和finally中均有return):
public class TryTest{ public static void main(String[] args){ System.out.println(test()); } private static int test(){ int num = 10; try{ System.out.println("try"); return num += 80; }catch(Exception e){ System.out.println("error"); }finally{ if (num > 20){ System.out.println("num>20 : " + num); } System.out.println("finally"); num = 100; return num; } } }
輸出結(jié)果如下:
try
num>20 : 90
finally
100
分析:try中的return語(yǔ)句同樣被拆分了,finally中的return語(yǔ)句先于try中的return語(yǔ)句執(zhí)行,因而try中的return被”覆蓋“掉了,不再執(zhí)行。
情況三(finally中改變返回值num):
public class TryTest{ public static void main(String[] args){ System.out.println(test()); } private static int test(){ int num = 10; try{ System.out.println("try"); return num; }catch(Exception e){ System.out.println("error"); }finally{ if (num > 20){ System.out.println("num>20 : " + num); } System.out.println("finally"); num = 100; } return num; } }
輸出結(jié)果如下:
try
finally
10
分析:雖然在finally中改變了返回值num,但因?yàn)閒inally中沒(méi)有return該num的值,因此在執(zhí)行完finally中的語(yǔ)句后,test()函數(shù)會(huì)得到try中返回的num的值,而try中的num的值依然是程序進(jìn)入finally代碼塊前保留下來(lái)的值,因此得到的返回值為10。
但是我們來(lái)看下面的情況(將num的值包裝在Num類中):
public class TryTest{ public static void main(String[] args){ System.out.println(test().num); } private static Num test(){ Num number = new Num(); try{ System.out.println("try"); return number; }catch(Exception e){ System.out.println("error"); }finally{ if (number.num > 20){ System.out.println("number.num>20 : " + number.num); } System.out.println("finally"); number.num = 100; } return number; } } class Num{ public int num = 10; }
輸出結(jié)果如下:
try
finally
100
從結(jié)果中可以看出,同樣是在finally中改變了返回值num的值,在情況三中,并沒(méi)有被try中的return返回(test()方法得到的不是100),但在這里卻被try中的return語(yǔ)句返回了。
對(duì)以上情況的分析,需要深入JVM虛擬機(jī)中程序執(zhí)行exection_table中的字節(jié)碼指令時(shí)操作棧的的操作情況,可以參考htp://www.dbjr.com.cn/kf/201010/76754.html)這篇文章,也可以參考《深入Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐》第6章中對(duì)屬性表集合的講解部分。
對(duì)于含有return語(yǔ)句的情況,這里我們可以簡(jiǎn)單地總結(jié)如下:
try語(yǔ)句在返回前,將其他所有的操作執(zhí)行完,保留好要返回的值,而后轉(zhuǎn)入執(zhí)行finally中的語(yǔ)句,而后分為以下三種情況:
- 情況一:如果finally中有return語(yǔ)句,則會(huì)將try中的return語(yǔ)句”覆蓋“掉,直接執(zhí)行finally中的return語(yǔ)句,得到返回值,這樣便無(wú)法得到try之前保留好的返回值。
- 情況二:如果finally中沒(méi)有return語(yǔ)句,也沒(méi)有改變要返回值,則執(zhí)行完finally中的語(yǔ)句后,會(huì)接著執(zhí)行try中的return語(yǔ)句,返回之前保留的值。
- 情況三:如果finally中沒(méi)有return語(yǔ)句,但是改變了要返回的值,這里有點(diǎn)類似與引用傳遞和值傳遞的區(qū)別,分以下兩種情況,:
1)如果return的數(shù)據(jù)是基本數(shù)據(jù)類型或文本字符串,則在finally中對(duì)該基本數(shù)據(jù)的改變不起作用,try中的return語(yǔ)句依然會(huì)返回進(jìn)入finally塊之前保留的值。
2)如果return的數(shù)據(jù)是引用數(shù)據(jù)類型,而在finally中對(duì)該引用數(shù)據(jù)類型的屬性值的改變起作用,try中的return語(yǔ)句返回的就是在finally中改變后的該屬性的值。
異常注意事項(xiàng)
多個(gè)異常使用捕獲又該如何處理呢?
1.多個(gè)異常分別處理。
2.多個(gè)異常一次捕獲,多次處理。
3.多個(gè)異常一次捕獲一次處理。
一般我們是使用一次捕獲多次處理方式,格式如下:
try{ //編寫可能出現(xiàn)異常的代碼 }catch(異常類型A e){//當(dāng)try中出現(xiàn)A類型異常,就用該catch來(lái)捕獲 //處理異常的代碼 //記錄日志/打印異常信息/繼續(xù)拋出異常 }catch(異常類型B e){//當(dāng)try中出現(xiàn)B類型異常,就用該catch來(lái)捕獲 //處理異常的代碼//記錄日志/打印異常信息/繼續(xù)拋出異常 }
注意:這種異常處理方式,要求多個(gè)catch中的異常不能相同,并且若catch中的多個(gè)異常之間有子父類異常的關(guān)系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。
運(yùn)行時(shí)異常被拋出可以不處理。即不捕獲也不聲明拋出。
如果finally有return語(yǔ)句,永遠(yuǎn)返回finally中的結(jié)果,避免該情況。
如果父類拋出了多個(gè)異常,子類重寫父類方法時(shí),拋出和父類相同的異?;蛘呤歉割惍惓5淖宇惢蛘卟粧伋霎惓?/p>
父類方法沒(méi)有拋出異常,子類重寫父類該方法時(shí)也不可拋出異常。此時(shí)子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出。
自定義異常
概述
為什么需要自定義異常類:
我們說(shuō)了Java中不同的異常類,分別表示著某一種具體的異常情況,那么在開(kāi)發(fā)中總是有些異常情況是SUN沒(méi)有定義好的,此時(shí)我們根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類。例如年齡負(fù)數(shù)問(wèn)題,考試成績(jī)負(fù)數(shù)問(wèn)題等等。
在上述代碼中,發(fā)現(xiàn)這些異常都是JDK內(nèi)部定義好的,但是實(shí)際開(kāi)發(fā)中也會(huì)出現(xiàn)很多異常,這些異常很可能在JDK中沒(méi)有定義過(guò),例如年齡負(fù)數(shù)問(wèn)題,考試成績(jī)負(fù)數(shù)問(wèn)題.那么能不能自己定義異常呢?
在開(kāi)發(fā)中根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類.比如:自定義一個(gè)業(yè)務(wù)邏輯異常:RegisterException。一個(gè)注冊(cè)異常類。
異常類如何定義:
1.自定義一個(gè)編譯期異常:自定義類并繼承于java.lang.Exception。
2.自定義一個(gè)運(yùn)行時(shí)期的異常類:自定義類并繼承于java.lang.RuntimeException。
自定義異常演示
要求:我們模擬注冊(cè)操作,如果用戶名已存在,則拋出異常并提示:親,該用戶名已經(jīng)被注冊(cè)。
首先定義一個(gè)注冊(cè)異常類RegisterException:
public class RegisterException extends Exception{ /** *空參構(gòu)造 */ public RegisterException (){ } /** * *@parammessage異常提示*/ public RegisterException(String message){ super (message); } }
模擬登陸操作,使用數(shù)組模擬數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),并提供當(dāng)前注冊(cè)賬號(hào)是否存在方法用于判斷。
public class Demo { private static String[]names={"lyan","zhyuqi","xdongdong"}; public static void main(String[]args) { try{ //可能出現(xiàn)異常的代碼 checkUsername("zhyuqi"); System.out.println("用戶名可用!");//沒(méi)有異常則用戶名沒(méi)有重復(fù),可用 }catch(RegisterException e){ //處理異常 e.printStackTrace(); } } //因?yàn)镽egisterException是編譯期異常,又想調(diào)用者去處理,所以在方法上聲明該異常 public static boolean checkUsername(String uname) throws RegisterException{for(Stringname:names){ if(name.equals(uname)){//如果名字在數(shù)組里面就拋出注冊(cè)異常 throw new RegisterException("親"+uname+"已經(jīng)被注冊(cè)了!"); } } return true; } }
到此這篇關(guān)于全面了解java異常的文章就介紹到這了,更多相關(guān)java異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在springboot3微項(xiàng)目中如何用idea批量創(chuàng)建單元測(cè)試邏輯
這篇文章主要介紹了在SpringBoot3項(xiàng)目中使用IntelliJIDEA批量創(chuàng)建單元測(cè)試包括準(zhǔn)備工作(確保項(xiàng)目配置正確,添加測(cè)試依賴),使用IntelliJIDEA創(chuàng)建測(cè)試,感興趣的朋友一起看看吧2024-10-10springboot -sse -flux 服務(wù)器推送消息的方法
這篇文章主要介紹了springboot -sse -flux 服務(wù)器推送消息的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11SpringBoot Jackson日期格式化統(tǒng)一配置的實(shí)現(xiàn)
Spring項(xiàng)目中經(jīng)常需要配置日期時(shí)間格式格式,本文主要介紹了SpringBoot Jackson日期格式化統(tǒng)一配置的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08JavaWeb Servlet實(shí)現(xiàn)網(wǎng)頁(yè)登錄功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb Servlet實(shí)現(xiàn)網(wǎng)頁(yè)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07SpringBoot使用AOP實(shí)現(xiàn)防重復(fù)提交功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用AOP實(shí)現(xiàn)防重復(fù)提交功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03maven中profile動(dòng)態(tài)打包不同環(huán)境配置文件的實(shí)現(xiàn)
開(kāi)發(fā)項(xiàng)目時(shí)會(huì)遇到這個(gè)問(wèn)題:開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境,生產(chǎn)環(huán)境的配置文件不同, 打包時(shí)經(jīng)常要手動(dòng)更改配置文件,本文就來(lái)介紹一下maven中profile動(dòng)態(tài)打包不同環(huán)境配置文件的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10BufferedInputStream(緩沖輸入流)詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了BufferedInputStream緩沖輸入流的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05