欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

java解惑你知多少(四)

系統 1953 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來退出finally語句塊,并且千萬不要允許受檢查的異常傳播到finally語句

塊之外。也就是說不要在finally塊內終止程序,而是執行完finally塊后,要將控制權移交給try塊,由try最終決定

怎樣結束方法的調用。

?

對于任何在finally語句塊中可能拋出的受檢查異常都要進行處理,而不是任其傳播,下面流拷貝程序在關閉流時沒有

防止異常的傳播,這會有問題:

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. ?? //這里應該使用try-catch將每個close包裝起來 ??
  14. ?? if (in?!=? null ){in.close();}??
  15. ?? if (in?!=? null ){out.close();}??
  16. ?}??
  17. }??

catch塊中的return語句是不會阻止finally塊執行的,那么catch塊中的continue和break能否阻止?答案是不會的,

與return一樣,finally語句塊是在循環被跳過(continue)和中斷(break)之前被執行的:

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捕獲異常規則

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

塊沒有拋出或不可能拋出檢測性異常,則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. ?? /*?!!?編譯出錯 ?
  12. ???try{ ?
  13. ????//... ?
  14. ???}catch?(IOException?e)?{ ?
  15. ???? ?
  16. ???} ?
  17. ???*/ ??
  18. ?}??
  19. }??

28.?重寫時方法異常范圍

重寫或實現時不能擴大異常的范圍,如果是多繼承,則異常取所有父類方法異常的交集或不拋出異常:

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. ? //?不能編譯通過,多繼承時只能取父類方法異常交集,這樣就不會擴大異常范圍 ??
  13. ? //?!!?void?f?()?throws?Exception; ??
  14. ? //?void?f();//?能編譯通過 ??
  15. ? //?能編譯通過,Exception與IOException的交集為IOException ??
  16. ? public ? void ?f()? throws ?IOException?{??
  17. ?}??
  18. }??

29.?靜態與非靜態final常量不能在catch塊中初始化

?

靜態與非靜態塊中如果拋出了異常,則一定要使用try-catch塊來捕獲。

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. }??

上面的程序編譯不能通過。表面上是可以的,因為i第一次初始化時可能拋出異常,所以拋異常時可以在catch塊中初

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

?

要確定一個程序是否不止一次地對一個空final進行賦值是很困難的問題。語言規范在這一點上采用了保守的方式。

30.?System.exit()與finally

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

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

?

System.exit將立即停止所有的程序線程,它并不會使finally語句塊得到調用,但是它在停止VM之前會執行關閉掛鉤

操作(這此掛鉤操作是注冊到Runtime.addShutdownHook上的線程),這對于釋放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 );??

?

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

會執行。
System.runFinalizersOnExit(true):該方法一定會回收,但不安全,已被廢棄。因為它可能對正在使用的對象調用

終結方法,而其他線程同時正在操作這些對象,從而導致不正確的行為或死鎖。

?

為了加快垃圾回收,使用System.gc(),但不一定馬上執行加收動作,由虛擬機決定,實質上是調用

Runtime.getRuntime().gc()。

?

System的很多方法都是調用Runtime類的相關方法來實現的。


31.?遞歸構造

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

如果在程序外面構造該類的實例,則會拋出java.lang.StackOverflowError錯誤。其原因是實例變量的初始化操作將

先于構造器的程序體而運行。


32.?構造器中的異常

如果父類構造器拋出了檢測異常,則子類也只能拋出,而不能采用try-catch來捕獲:

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塊中明確調用父類構造器,因為構造的 ??
  9. ??? //?明確調用只能放在第一行 ??
  10. ??? //?!!?super(); ??
  11. ?? //try-catch不能捕獲到父類構造器所拋出的異常,子類只能拋出 ??
  12. ??}? catch ?(Exception?e)?{??
  13. ??}??
  14. ?}??
  15. }??

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

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. ?????*?!!編譯不能通過,因為str2為靜態的,他不能通過構造器來捕獲,所以只 ?
  16. ?????*?能使用靜態方法來捕獲。即初始化靜態成員時不能拋出捕獲性異常。? ?
  17. ?????*/ ??
  18. ???? //!!private?static?String?str2?=?String.class.newInstance(); ??
  19. ??????
  20. ???? //?只能使用靜態方法來捕獲異常,如果是拋出的運行時異常則不需要捕獲 ??
  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虛擬機對棧的深度限制到了某個值,當超過這個值時,VM就拋出StackOverflowError。一般VM都將棧的深度限制

為1024,即當方法調用方法的層次超過1024時就會產生StackOverflowError。

java解惑你知多少(四)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色人人 | 国产gav成人免费播放视频 | 激情六月丁香婷婷 | 天堂一区二区三区四区 | 国产午夜精品一区二区三区嫩草 | 黄在线 | 美女一级| a级高清免费 | 国产成人91激情在线播放 | 96国产xxxx| 亚洲成人福利网站 | 激情 亚洲 | 一区二区三区毛片 | 久久精品视频免费观看 | 色婷婷小说| 91久久线看在观草草青青 | 99热久久国产精品免费看 | 欧美精品播放 | 免费观看的av | 五月婷婷激情第五季 | 欧美日韩一区二区三区在线观看 | 黄色片快播 | 国产短视频精品区第一页 | 日一区二区 | 精品一区二区三区在线播放 | 日本成人中文字幕 | 99国产精品自拍 | 久久草在线视频免费 | 亚洲国产一区二区三区四区 | 99久久婷婷 | 一级毛片在线观看视频 | 欧美激情日韩 | 三级毛片在线看 | 久久精品中文 | 欧美性色生活片免费播放 | 日韩欧美国产视频 | 日韩欧美在线播放 | 国产成人精品视频播放 | 伊人久久精品成人网 | 天天做天天爱天天影视综合 | 91在线观看视频 |