亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java解惑你知多少(四)

系統(tǒng) 1893 0

異常

26.?finally與中斷

Java代碼 ? ? 收藏代碼
  1. //該方法返回false ??
  2. static ? boolean ?f()?{??
  3. ? try ?{??
  4. ?? return ? true ;??
  5. ?}? finally ?{??
  6. ?? return ? false ;??
  7. ?}??
  8. }??

不要用return、break、continue或throw來(lái)退出finally語(yǔ)句塊,并且千萬(wàn)不要允許受檢查的異常傳播到finally語(yǔ)句

塊之外。也就是說(shuō)不要在finally塊內(nèi)終止程序,而是執(zhí)行完finally塊后,要將控制權(quán)移交給try塊,由try最終決定

怎樣結(jié)束方法的調(diào)用。

?

對(duì)于任何在finally語(yǔ)句塊中可能拋出的受檢查異常都要進(jìn)行處理,而不是任其傳播,下面流拷貝程序在關(guān)閉流時(shí)沒(méi)有

防止異常的傳播,這會(huì)有問(wèn)題:

Java代碼 ? ? 收藏代碼
  1. static ? void ?copy(String?src,?String?dest)? throws ?IOException?{??
  2. ?InputStream?in?=? null ;??
  3. ?OutputStream?out?=? null ;??
  4. ? try ?{??
  5. ??in?=? new ?FileInputStream(src);??
  6. ??out?=? new ?FileOutputStream(dest);??
  7. ?? byte []?buf?=? new ? byte [ 1024 ];??
  8. ?? int ?n;??
  9. ?? while ?((n?=?in.read(buf))?>=? 0 )?{??
  10. ???out.write(buf,? 0 ,?n);??
  11. ??}??
  12. ?}? finally {??
  13. ?? //這里應(yīng)該使用try-catch將每個(gè)close包裝起來(lái) ??
  14. ?? if (in?!=? null ){in.close();}??
  15. ?? if (in?!=? null ){out.close();}??
  16. ?}??
  17. }??

catch塊中的return語(yǔ)句是不會(huì)阻止finally塊執(zhí)行的,那么catch塊中的continue和break能否阻止?答案是不會(huì)的,

與return一樣,finally語(yǔ)句塊是在循環(huán)被跳過(guò)(continue)和中斷(break)之前被執(zhí)行的:

Java代碼 ? ? 收藏代碼
  1. int ?i?=? 0 ;??
  2. System.out.println( "--continue--" );??
  3. while ?(i++?<=? 1 )?{??
  4. ? try ?{??
  5. ??System.out.println( "i=" ?+?i);??
  6. ?? continue ;??
  7. ?}? catch ?(Exception?e)?{??
  8. ?}? finally ?{??
  9. ??System.out.println( "finally" );??
  10. ?}??
  11. }??
  12. System.out.println( "--break--" );??
  13. while ?(i++?<=? 3 )?{??
  14. ? try ?{??
  15. ??System.out.println( "i=" ?+?i);??
  16. ?? break ;??
  17. ?}? catch ?(Exception?e)?{??
  18. ?}? finally ?{??
  19. ??System.out.println( "finally" );??
  20. ?}??
  21. }??

27.?catch捕獲異常規(guī)則

捕獲RuntimeException、Exception或Throwable的catch語(yǔ)句是合法,不管try塊里是否拋出了這三個(gè)異常。但如果try

塊沒(méi)有拋出或不可能拋出檢測(cè)性異常,則catch不能捕獲這些異常,如IOException異常:

Java代碼 ? ? 收藏代碼
  1. public ? class ?Test?{??
  2. ? public ? static ? void ?main(String[]?args)?{??
  3. ?? try {??
  4. ??? //... ??
  5. ??} catch ?(Exception?e)?{??
  6. ?????
  7. ??} catch ?(Throwable?e)?{??
  8. ?????
  9. ??}??
  10. ????
  11. ?? /*?!!?編譯出錯(cuò) ?
  12. ???try{ ?
  13. ????//... ?
  14. ???}catch?(IOException?e)?{ ?
  15. ???? ?
  16. ???} ?
  17. ???*/ ??
  18. ?}??
  19. }??

28.?重寫(xiě)時(shí)方法異常范圍

重寫(xiě)或?qū)崿F(xiàn)時(shí)不能擴(kuò)大異常的范圍,如果是多繼承,則異常取所有父類(lèi)方法異常的交集或不拋出異常:

Java代碼 ? ? 收藏代碼
  1. interface ?I1?{??
  2. ? void ?f()? throws ?Exception;??
  3. }??
  4. ??
  5. interface ?I2?{??
  6. ? void ?f()? throws ?IOException;??
  7. }??
  8. ??
  9. interface ?I3? extends ?I1,?I2?{}??
  10. ??
  11. class ?Imp? implements ?I3?{??
  12. ? //?不能編譯通過(guò),多繼承時(shí)只能取父類(lèi)方法異常交集,這樣就不會(huì)擴(kuò)大異常范圍 ??
  13. ? //?!!?void?f?()?throws?Exception; ??
  14. ? //?void?f();//?能編譯通過(guò) ??
  15. ? //?能編譯通過(guò),Exception與IOException的交集為IOException ??
  16. ? public ? void ?f()? throws ?IOException?{??
  17. ?}??
  18. }??

29.?靜態(tài)與非靜態(tài)final常量不能在catch塊中初始化

?

靜態(tài)與非靜態(tài)塊中如果拋出了異常,則一定要使用try-catch塊來(lái)捕獲。

Java代碼 ? ? 收藏代碼
  1. public ? class ?Test?{??
  2. ? static ? final ? int ?i;??
  3. ? static ?{??
  4. ?? try ?{??
  5. ???i?=?f();??
  6. ??}? catch ?(RuntimeException?e)?{??
  7. ???i?=? 1 ;??
  8. ??}??
  9. ?}??
  10. ??
  11. ? static ? int ?f()?{??
  12. ?? throw ? new ?RuntimeException();??
  13. ?}??
  14. }??

上面的程序編譯不能通過(guò)。表面上是可以的,因?yàn)閕第一次初始化時(shí)可能拋出異常,所以?huà)伄惓r(shí)可以在catch塊中初

始化,最終還是只初始化一次,這正是空f(shuō)inal所要求的,但為什么編譯器不知道這些呢?

?

要確定一個(gè)程序是否不止一次地對(duì)一個(gè)空f(shuō)inal進(jìn)行賦值是很困難的問(wèn)題。語(yǔ)言規(guī)范在這一點(diǎn)上采用了保守的方式。

30.?System.exit()與finally

Java代碼 ? ? 收藏代碼
  1. try ?{??
  2. ?System.out.println( "Hello?world" );??
  3. ?System.exit( 0 );??
  4. ? //?或者使用Runtime退出系統(tǒng) ??
  5. ? //?Runtime.getRuntime().exit(0); ??
  6. }? finally ?{??
  7. ?System.out.println( "Goodbyte?world" );??
  8. }??

上面的程序會(huì)打印出"Goodbyte world"嗎?不會(huì)。

?

System.exit將立即停止所有的程序線(xiàn)程,它并不會(huì)使finally語(yǔ)句塊得到調(diào)用,但是它在停止VM之前會(huì)執(zhí)行關(guān)閉掛鉤

操作(這此掛鉤操作是注冊(cè)到Runtime.addShutdownHook上的線(xiàn)程),這對(duì)于釋放VM之外的資源很有幫助。使用掛鉤程

序修改上面程序:

Java代碼 ? ? 收藏代碼
  1. System.out.println( "Hello?world" );??
  2. Runtime.getRuntime().addShutdownHook( new ?Thread()?{??
  3. ? public ? void ?run()?{??
  4. ??System.out.println( "Goodbyte?world" );??
  5. ?}??
  6. });??
  7. System.exit( 0 );??

?

另外,對(duì)象回收時(shí),使用VM調(diào)用對(duì)象的finalize()方法有兩種:
System.runFinalization():該方法讓虛擬機(jī)也只是盡最大努力去完成所有未執(zhí)行的finalize()終止方法,但不一定

會(huì)執(zhí)行。
System.runFinalizersOnExit(true):該方法一定會(huì)回收,但不安全,已被廢棄。因?yàn)樗赡軐?duì)正在使用的對(duì)象調(diào)用

終結(jié)方法,而其他線(xiàn)程同時(shí)正在操作這些對(duì)象,從而導(dǎo)致不正確的行為或死鎖。

?

為了加快垃圾回收,使用System.gc(),但不一定馬上執(zhí)行加收動(dòng)作,由虛擬機(jī)決定,實(shí)質(zhì)上是調(diào)用

Runtime.getRuntime().gc()。

?

System的很多方法都是調(diào)用Runtime類(lèi)的相關(guān)方法來(lái)實(shí)現(xiàn)的。


31.?遞歸構(gòu)造

Java代碼 ? ? 收藏代碼
  1. public ? class ?S??{??
  2. ? private ?S?instance?=? new ?S();??
  3. ? public ?S()?{}??
  4. }??

如果在程序外面構(gòu)造該類(lèi)的實(shí)例,則會(huì)拋出java.lang.StackOverflowError錯(cuò)誤。其原因是實(shí)例變量的初始化操作將

先于構(gòu)造器的程序體而運(yùn)行。


32.?構(gòu)造器中的異常

如果父類(lèi)構(gòu)造器拋出了檢測(cè)異常,則子類(lèi)也只能拋出,而不能采用try-catch來(lái)捕獲:

Java代碼 ? ? 收藏代碼
  1. public ? class ?P?{??
  2. ? public ?P()? throws ?Exception?{}??
  3. }??
  4. ??
  5. class ?S? extends ?P?{??
  6. ? public ?S()? throws ?Exception?{??
  7. ?? try ?{??
  8. ??? //?不能在try塊中明確調(diào)用父類(lèi)構(gòu)造器,因?yàn)闃?gòu)造的 ??
  9. ??? //?明確調(diào)用只能放在第一行 ??
  10. ??? //?!!?super(); ??
  11. ?? //try-catch不能捕獲到父類(lèi)構(gòu)造器所拋出的異常,子類(lèi)只能拋出 ??
  12. ??}? catch ?(Exception?e)?{??
  13. ??}??
  14. ?}??
  15. }??

?
如果初使化實(shí)例屬性時(shí)拋出了異常,則構(gòu)造器只能拋出異常,在構(gòu)造器中捕獲不起作用:

Java代碼 ? ? 收藏代碼
  1. public ? class ?A?{??
  2. ???? private ?String?str?=?String. class .newInstance();??
  3. ??
  4. ???? public ?A()? throws ?InstantiationException,?IllegalAccessException?{}??
  5. ??
  6. ???? public ?A( int ?i)? throws ?Exception?{??
  7. ???????? try ?{ //即使這里捕獲了,方法簽名還是得要拋出 ??
  8. ??
  9. ????????}? catch ?(Exception?e)?{??
  10. ??
  11. ????????}??
  12. ????}??
  13. ??
  14. ???? /* ?
  15. ?????*?!!編譯不能通過(guò),因?yàn)閟tr2為靜態(tài)的,他不能通過(guò)構(gòu)造器來(lái)捕獲,所以只 ?
  16. ?????*?能使用靜態(tài)方法來(lái)捕獲。即初始化靜態(tài)成員時(shí)不能拋出捕獲性異常。? ?
  17. ?????*/ ??
  18. ???? //!!private?static?String?str2?=?String.class.newInstance(); ??
  19. ??????
  20. ???? //?只能使用靜態(tài)方法來(lái)捕獲異常,如果是拋出的運(yùn)行時(shí)異常則不需要捕獲 ??
  21. ???? private ? static ?String?str2?=?newInstance();??
  22. ??
  23. ???? private ? static ?String?newInstance()? throws ?RuntimeException?{??
  24. ???????? try ?{??
  25. ???????????? return ?String. class .newInstance();??
  26. ????????}? catch ?(Exception?e)?{??
  27. ????????????e.printStackTrace();??
  28. ????????}??
  29. ???????? return ? null ;??
  30. ????}??
  31. }??

33.?StackOverflowError

Java虛擬機(jī)對(duì)棧的深度限制到了某個(gè)值,當(dāng)超過(guò)這個(gè)值時(shí),VM就拋出StackOverflowError。一般VM都將棧的深度限制

為1024,即當(dāng)方法調(diào)用方法的層次超過(guò)1024時(shí)就會(huì)產(chǎn)生StackOverflowError。

java解惑你知多少(四)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产欧美日韩精品一区二区三区 | 高清一级毛片免免费看 | 国产好大好爽久久久久久久 | 美国免费三片在线观看 | 色婷婷久久综合中文久久一本` | 色天使色婷婷丁香久久综合 | 真实国产乱人伦在线视频播放 | 一区二区三区中文 | 国产毛茸茸| 奇米777视频国产 | 精品视频久久 | 久久国产精品岛国搬运工 | 国产成人亚洲综合一区 | 四虎免费紧急入口观看 | 亚洲欧美日韩国产综合专区 | 深夜成人性视频免费看 | 亚洲国产成人在线视频 | 午夜色网站| 9999精品视频 | 欧美香蕉视频在线观看 | 一道本免费视频 | 91久久老司机福利精品网 | 亚洲美女亚洲精品久久久久 | 色女孩综合 | 欧美午夜伦y4480私人影院 | 欧美一级永久免费毛片在线 | 伊人久久免费视频 | 亚洲 欧美 精品 中文第三 | 日本精品在线视频 | 国产综合亚洲欧美日韩一区二区 | va亚洲va日韩不卡在线观看 | 全部免费毛片在线 | 天天摸夜夜添 | 国产香蕉免费精品视频 | 国产欧美一区二区三区在线 | 国产亚洲美女精品久久久2020 | 日韩高清毛片 | 日本三级11k影院在线 | 久久精品久噜噜噜久久 | 黑人超长巨大xxxxxxx视频 | 久久香蕉国产线看免费 |