<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          最常見的10種Java異常問題!

          共 3853字,需瀏覽 8分鐘

           ·

          2021-02-04 08:19

          封面:洛小汐

          者:潘潘

          前言

          本文總結(jié)了有關(guān)Java異常的十大常見問題。

          目錄

          1. 檢查型異常(checked) vs. 非檢查型異常(Unchecked)
          2. 異常管理的最佳實(shí)踐箴言
          3. 為什么在try代碼塊中聲明的變量不能在catch或者finally中被引用?
          4. 為什么 Double.parseDouble(null) 和 Integer.parseInt(null) 拋出的異常不一樣呢?
          5. Java中經(jīng)常使用的運(yùn)行時(shí)異常
          6. 我們可以在同一個(gè)catch子句中捕獲多個(gè)異常嗎?
          7. 在 Java 中構(gòu)造方法能拋出異常嗎?
          8. 在 final 代碼塊中拋出異常
          9. try語句有return那么finally還會(huì)執(zhí)行嗎?
          10. 為何有些開發(fā)人員對(duì)異常置之不理?

          1.檢查型異常(checked) vs 非檢查型異常(Unchecked)

          簡(jiǎn)單來說,對(duì)于檢查型異常, 一般在 編譯期 就會(huì)被檢查到,所以我們肯定會(huì)提前在方法內(nèi)進(jìn)行捕獲處理,或者在方法頭部申明并拋出。而非檢查型異常,往往無法提前預(yù)知,例如被除數(shù)是0、空指針等。檢查型異常特別重要,它會(huì)告訴那些調(diào)用你的接口的開發(fā)者們,如何提前預(yù)知并處理好這些可能發(fā)生的異常。

          例如,IOException就是常見的檢查型異常,而 RuntimeException(運(yùn)行時(shí)異常)就是非檢查型異常。在閱讀剩余部分之前你或許可以研讀這份Java異常的層次結(jié)構(gòu)圖。

          2.異常管理的最佳實(shí)踐箴言

          如果可以正確處理異常,則應(yīng)將其捕獲并處理,否則應(yīng)將其拋出。

          3. 為什么在try代碼塊中聲明的變量不能在catch或者finally中被引用?

          看下面這段代碼,在try代碼塊中聲明的 String s 就不能在catch中被引用, 這段代碼在編譯期是通不過的。

          try?{
          ?File?file?=?new?File("path");
          ?FileInputStream?fis?=?new?FileInputStream(file);
          ?String?s?=?"inside";
          }?catch?(FileNotFoundException?e)?{
          ?e.printStackTrace();
          ?System.out.println(s);
          }

          原因是你不知道在try代碼塊中哪個(gè)位置會(huì)引發(fā)異常, 很有可能在聲明對(duì)象之前就引發(fā)了異常。對(duì)于這個(gè)特定的示例,是正確的。

          4.為什么 Double.parseDouble(null) 和 Integer.parseInt(null) 拋出的異常不一樣呢?

          它倆拋出的異常確實(shí)不同,但這是JDK的問題,當(dāng)時(shí)開發(fā)這兩個(gè)接口的開發(fā)人員不是同一波,所以我們沒必要去糾結(jié)這個(gè)問題。

          Integer.parseInt(null);?
          //?throws?java.lang.NumberFormatException:?null?

          Double.parseDouble(null);?
          //?throws?java.lang.NullPointerException

          5.Java中經(jīng)常使用的運(yùn)行時(shí)異常

          這里列舉一部分:

          IllegalArgumentException ArrayIndexOutOfBoundsException

          在有些場(chǎng)景某個(gè)目標(biāo)對(duì)象不滿足我們的預(yù)期,會(huì)用到這些異常,例如下面在 if 判斷語句中被使用:

          if?(obj?==?null)?{
          ???throw?new?IllegalArgumentException("obj?can?not?be?null");

          6.我們可以在同一個(gè)catch子句中捕獲多個(gè)異常嗎?

          答案是當(dāng)然可以,不過如果在同一個(gè)catch子句中捕獲的這些異常都直接或間接繼承自同一父類,那么就只能在catch子句中捕獲父類了。

          //?Java?7?之前需要這樣
          catch?(AException?a)?{
          ?????logger.error(a);
          ?????throw?new?MyException("a");
          catch?(BException?b)?{
          ?????logger.error(b);
          ?????throw?new?MyException("b");
          }catch?(CException?c)?{
          ?????logger.error(c);
          ?????throw?new?MyException("c");
          }

          //?在Java?7中,可以捕獲所有這些異常?
          catch(AException?|?BException?|?CException?ex){
          ?????logger.error(ex);
          ?????throw?new?MyException(ex);
          }

          補(bǔ)充說明 : 其實(shí)是這樣,在 Java7 就開始支持catch子句捕獲多個(gè)異常,多個(gè)異常使用 XOR符號(hào)(I) 連接,異常的發(fā)生有可能是 A | B,但不能同時(shí)出現(xiàn),相當(dāng)于這些異常不能是間接或直接繼承自同一個(gè)父類,因?yàn)槿绻鸄B都繼承同一父類,那就不能 A|B 都寫上,這也是繼承原則。

          7.在 Java 中構(gòu)造方法能拋出異常嗎?

          答案是當(dāng)然可以,構(gòu)造方法僅是一種特殊方法而已。可以參考這個(gè)示例。

          class?FileReader{
          ?public?FileInputStream?fis?=?null;
          ?
          ?public?FileReader()?throws?IOException{
          ??File?dir?=?new?File(".");//get?current?directory
          ??File?fin?=?new?File(dir.getCanonicalPath()?+?
          ??????????????????????????File.separator?+?"not-existing-file.txt");
          ??fis?=?new?FileInputStream(fin);
          ?}
          }

          8.在 final 代碼塊中拋出異常

          下面這個(gè)寫法是合法的:

          public?static?void?main(String[]?args)?{
          ?File?file1?=?new?File("path1");
          ?File?file2?=?new?File("path2");
          ?try?{
          ?
          ??FileInputStream?fis?=?new?FileInputStream(file1);
          ?}?catch?(FileNotFoundException?e)?{
          ??e.printStackTrace();
          ?}?finally?{
          ??try?{
          ???FileInputStream?fis?=?new?FileInputStream(file2);
          ??}?catch?(FileNotFoundException?e)?{
          ???e.printStackTrace();
          ??}
          ?}
          }

          但是為了獲得更好的代碼可讀性,你應(yīng)該將把 try-catch代碼塊封裝成一個(gè)新方法,然后將方法調(diào)用放在finally子句中:

          public?static?void?main(String[]?args)?{
          ?File?file1?=?new?File("path1");
          ?File?file2?=?new?File("path2");
          ?try?{
          ?
          ??FileInputStream?fis?=?new?FileInputStream(file1);
          ?}?catch?(FileNotFoundException?e)?{
          ??e.printStackTrace();
          ?}?finally?{
          ????????//?封裝方法
          ??methodThrowException();?
          ?}
          }

          9.try語句有return那么finally還會(huì)執(zhí)行嗎?

          答案是肯定會(huì)執(zhí)行。

          Java官方文檔描述:The finally block always executes when the try block exits

          意思就是 ” 只要存在try代碼塊,finally代碼塊就一定會(huì)執(zhí)行 ” ,這種特性可以讓程序員避免在try語句中使用return, continue或者break關(guān)鍵字而忽略了關(guān)閉相關(guān)資源的操作等。

          10.為何有些開發(fā)人員對(duì)異常置之不理?

          很多時(shí)候會(huì)見到下面這種代碼寫法。允許的情況下盡可能捕獲異常并且進(jìn)行處理,不知道為什么很多開發(fā)人員就是這么干?

          try?{
          ?????...
          }?catch(Exception?e)?{
          ?????e.printStackTrace();
          }

          忽略異常是一件很容易做到的事,雖然這種寫法很常見,但不一定是正確的寫法。

          參考文獻(xiàn):
          1. Unchecked exceptions in Java
          2. The root of Java exception class hierarchy
          3. Java exceptions related questions in stackoverflow

          譯文完,由于個(gè)人理解能力和知識(shí)寬度有限,譯文中存在失誤之處,還請(qǐng)見諒,歡迎指正。


          往期推薦

          SpringBoot接口冪等性實(shí)現(xiàn)的4種方案!


          try-catch-finally中的4個(gè)巨坑,老程序員也搞不定!


          對(duì)象復(fù)制的7種方法,還是Spring的最好用!


          關(guān)注我,每天陪你進(jìn)步一點(diǎn)點(diǎn)!

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品人妻无码八区牛牛 | 操逼黄| 少妇一区二区三区97 | 午夜性爱视频在线播放 | 日韩精品一区二区在线观看 |