[轉載] Java異常處理習題

ey_snail發表於2020-12-24

參考連結: Java程式的輸出| 12(異常處理)

一、選擇題 

1、java中用來丟擲異常的關鍵字是( ) 

A.try      B.catch    C.throw          D.finally 

  

2、關於異常,下列說法正確的是( ) 

A. 異常是一種物件        B.一旦程式執行,異常將被建立 

C.為了保證程式執行速度,要儘量避免異常控制     D.以上說法都不對 

  

3、()類是所有異常類的父類。 

A.Throwable     B.Error      C.Exception    D. AWTError 

  

4、java語言中,下列哪一子句是異常處理的出口( ) 

A.try{…}子句   B.catch{…}子句  C.finally{…}子句 D.以上說法都不對 

  

5.下列程式的執行,說法錯誤的是( ) 

class MultiCatch 

 { 

   public static voidmain(String args[]) 

     { 

       try 

          { 

            inta=args.length; 

            int b=42/a; 

            intc[]={1}; 

            c[42]=99; 

           System.out.println(“b=”+b); 

          } 

      catch(ArithmeticException e) 

          { 

            System.out.println(“除0異常:”+e); 

           } 

      catch(ArrayIndexOutOfBoundsException e) 

          { 

            System.out.println(“陣列超越邊界異常:”+e); 

            } 

           } 

    } 

A.程式將輸出第15行的異常資訊 

B.程式第10行出錯 

C.程式將輸出“b=42” 

D.程式將輸出第19行的異常資訊 

  

6、下列程式的執行,說法正確的是( ) 

class ExMulti 

  static voidprocedure() 

  { 

    try 

     { 

      int c[]={1}; 

      c[42]=99; 

     } 

   catch(ArrayIndexOutOfBoundsException e) 

     { 

      System.out.println(“陣列超越界限異常:”+e); 

     } 

   } 

    public static voidmain(String args[]) 

    { 

      try 

        { 

          procedure(); 

          inta=args.length; 

          int b=42/a; 

         System.out.println(“b=”+b); 

         } 

      catch(ArithmeticException e) 

         { 

          System.out.println(“除0異常:”+e); 

         } 

       } 

   } 

A.程式只輸出第12行的異常資訊 

B.程式只輸出第26行的異常資訊 

C.程式將不輸出異常資訊 

D.程式將輸出第12行和第26行的異常資訊 

  

7、下面程式丟擲了一個“異常”並捕捉它。請在橫線處填入適當內容完成程式。 

class TrowsDemo 

  static voidprocedure() throws IllegalAccessExcepton 

  { 

    System.out.println(“inside procedure”); 

   throw_______IllegalAccessException(“demo”); 

  } 

 public static voidmain(String args[]) 

   { 

     try 

      { 

        procedure(); 

      } 

      ___________ 

      { 

       System.out.println(“捕獲:”+e); 

      } 

    } 

finally語句塊中的程式碼(     ) 

A.總是被執行     

B.當try語句塊後面沒有catch時,finally中的程式碼才會執行 

C.異常發生時才執行                           

D.異常沒有發生時才被執行 

  

8、丟擲異常應該使用的關鍵字是(     ) 

A.throw         B.catch      C.finally           D.throws 

  

9、自定義異常類時,可以繼承的類是(     ) 

A.Error           B.Applet          C.Exception及其子類  D.AssertionError 

10、在異常處理中,將可能丟擲異常的方法放在(     )語句塊中 

A.throws               B.catch              C.try          D.finally 

  

11、對於try{……}catch子句的排列方式,下列正確的一項是(     ) 

A.子類異常在前,父類異常在後   B.父類異常在前,子類異常在後 

C.只能有子類異常                              D.父類異常與子類異常不能同時出現 

  

12、使用catch(Exception e)的好處是(     ) 

A.只會捕獲個別型別的異常 

B.捕獲try語句塊中產生的所有型別的異常 

C.忽略一些異常 

D.執行一些程式 

  

13.請問所有的異常類皆繼承哪一個類?(    ) 

A.java.lang.Throwable                B.java.lang.Exception 

C.java.lang.Error                     D.java.io.Exception 

  

14.對於已經被定義過可能丟擲異常的語句,在程式設計時(      )。 

A.必須使用try/catch語句處理異常,或用throw將其丟擲。 

B.如果程式錯誤,必須使用 try/catch語句處理異常。 

C.可以置之不理。 

D.只能使用try/catch語句處理。 

  

15.下面程式段的執行結果是什麼?(      ) 

  public class Foo{  

   public static voidmain(String[] args){   

    try{ 

      return;}  

      finally{System.out.println("Finally"); 

     }  

   }  

  } 

A.編譯能通過,但執行時會出現一個例外。  B.程式正常執行,並輸出 "Finally"。 

C.程式正常執行,但不輸出任何結果。 D.因為沒有catch語句塊,所以不能通過編譯。 

  

16.下面是一些異常類的層次關係: 

       java.lang.Exception 

          java.lang.RuntimeException 

              java.lang.IndexOutOfBoundsException 

                  java.lang.ArrayIndexOutOfBoundsException 

java.lang.StringIndexOutOfBoundsException 

假設有一個方法X,能夠丟擲兩個異常,Array Index和String Index異常,假定方法X中沒有try-catch語句處理這些異常,下面哪個答案是正確的?(   ) 

A.方法X 應該宣告拋棄ArrayIndexOutOfBoundsException和StringIndexOutOfBounds-Exception。 

B.如果呼叫X的方法捕獲IndexOutOfBoundsException,則ArrayIndexOutOfBounds- Exception和StringIndexOutOfBoundsException都可以被捕獲。 

C.如果方法X宣告拋棄IndexOutOfBoundsException,則呼叫X的方法必須用try-catch語句捕獲。 

D.方法X不能宣告拋棄異常。 

  

17.下面的方法是一個不完整的方法,其中的方法unsafe()會丟擲一個IOException,那麼在方法的①處應加入哪條語句,才能使這個不完整的方法成為一個完整的方法?(    ) 

①  ____________________________ 

②  { if(unsafe())   {//do something…}  

③    else if(safe())  {//do the other…}  

④  } 

A.public IOExceptionmethodName()   B.public void methodName()throw IOException 

C.public void methodName()        D.public voidmethodName() throws IOException   

  

18.如果下列的方法能夠正常執行,在控制檯上將不顯示什麼?(     ) 

  public void example( ){  

   try{  

      unsafe();  

     System.out.println("Test1");  

     }  

   catch(SafeException e)  

     {System.out.println("Test2");}  

   finally{System.out.println("Test3");}  

   System.out.println("Test4");  

  } 

A.Test 1          B. Test 2          C.Test 3            D. Test 4 

  

二、填空題 

1、catch子句都帶一個引數,該引數是某個異常的類及其變數名,catch用該引數去與____丟擲異常 ___物件的類進行匹配。 

2、java虛擬機器能自動處理____  執行 ___異常。 

3、變數屬性是描述變數的作用域,按作用域分類,變數有區域性變數、類變數、方法引數和___全域性引數 ____ 

4、同一段程式可能產生不止一種異常。可以放置多個____ catch ____子句,其中每一種異常型別都將被檢查,第一個與之匹配的就會被執行。 

5、捕獲異常要求在程式的方法中預先宣告,在呼叫方法時用try-catch-___  finally___語句捕獲並處理。 

6、java語言認為那些可預料和不可預料的出錯稱為_____異常____ 

7、按異常處理不同可以分為執行異常、捕獲異常、宣告異常和___丟擲異常___幾種。 

8、丟擲異常的程式程式碼可以是___自定義異常類或者是JDK中的某個類,還可以是JVN. 

9、丟擲異常、生成異常物件都可以通過____throw_____語句實現。 

10、捕獲異常的統一出口通過___finally______語句實現。 

11、java語言的類庫中提供了一個_____ Throwable_____類,所有的異常都必須是它的例項或它子類的例項。 

12、Throwable類有兩個子類:____ Error______類和Exception類。 

13、對程式語言而言,一般有編譯錯誤和______執行______錯誤兩類。 

14、一個try語句塊後必須跟___catch_______語句塊,____finally______語句塊可以沒有 

15、自定義異常類必須繼承_____Exception_____類及其子類 

16、異常處理機制允許根據具體的情況選擇在何處處理異常,可以在_____catch_____捕獲並處理,也可以用throws子句把他交給____呼叫棧中上層的方法 ______處理 

  

三.簡答題 

1.什麼是異常?簡述Java的異常處理機制。  

答:異常是指在執行程式碼序列中產生的異常情況,換句話說異常是一個執行時的錯誤。 

程式在執行時出現異常沒有相應的處理措施時,Java會自動捕獲並在異常發生處結束執行 

2.系統定義的異常與使用者自定義的異常有何不同?如何使用這兩類異常? 

系統定義的異常時特定情況出現的問題,而此時用來對可能遇到的問題進行處理。使用者定義的是自己覺得可能會出現問題時,需要處理的異常,這樣做可避免程式中斷或是出現未知錯誤。 

3.在Java的異常處理機制中,try程式塊、catch程式塊和finally程式塊各起到什麼作用?try-catch-finally語句如何使用? 

4.說明throws與throw的作用。 

throw語句用在方法體內,表示丟擲異常,由方法體內的語句處理    

throws語句用在方法宣告後面,表示再丟擲異常,由呼叫這個方法的上一級方法中的語句來處理 

5.Throw/throws有什麼聯絡和區別? 

1)throws出現在方法函式頭;而throw出現在函式體;    

 2)throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是丟擲了異常,執行throw則一定丟擲了某種異常;    

 3)兩者都是消極處理異常的方式(這裡的消極並不是說這種方式不好),只是丟擲或者可能丟擲異常,但是不會由函式去處理異常,真正的處理異常由函式的上層呼叫處理。 

6.如何自定義異常類? 

     答:class  異常名稱 extends Exception{} 

7.談談final、finally的區別和作用           

final是全域性變數宣告的時候使用,意思是這個變數不可被修改,不可被override,一般用於宣告常量,或者系統設定的值。 

finally是在try-catch-finally塊中配套使用,作用是,不管程式碼執行了try還是catch,最後一定會執行finally裡面的程式碼 

8.如果try{}裡有一個return語句,那麼緊跟在這個try後的finally{}裡的程式碼會不會被執行? 

finally是一定會執行的 

只有程式碼中有system.exit()這一種情況才不會執行finally 

因為終止了虛擬機器程式 

finally會在return之前執行 

如果在finally裡面有return情況會更復雜 

9.Error和Exception有什麼區別?  

Error類和Exception類都繼承自Throwable類。 

Error的繼承關係: 

java.lang.Object >java.lang.Throwable > java.lang.Error 

Exception的繼承關係: 

java.lang.Object >java.lang.Throwable >java.lang.Exception 

Exception: 

1.可以是可被控制(checked) 或不可控制的(unchecked) 

2.表示一個由程式設計師導致的錯誤 

3.應該在應用程式級被處理 

Error: 

1.總是不可控制的(unchecked) 

2.經常用來用於表示系統錯誤或低層資源的錯誤 

3.如何可能的話,應該在系統級被捕捉 

10.什麼是RuntimeException?列舉至少4個RuntimeException的子類 

  

RuntimeException是java中所有執行時異常的父類,實際執行時出現的都是它的子類,看看RuntimeException的Java doc就可以隨便列出幾個: 

1, 

Object x = new Integer(0); 

     System.out.println((String)x); 

當試圖將物件強制轉換為不是例項的子類時,丟擲該異常(ClassCastException) 

2. 

int a=5/0; 

一個整數“除以零”時,丟擲ArithmeticException異常。 

3,  

String s=null; 

int size=s.size(); 

當應用程式試圖在需要物件的地方使用 null 時,丟擲NullPointerException異常 

4,  

"hello".indexOf(-1); 

指示索引或者為負,或者超出字串的大小,丟擲StringIndexOutOfBoundsException異常 

5, 

String[] ss=new String[-1]; 

如果應用程式試圖建立大小為負的陣列,則丟擲NegativeArraySizeException異常。 

  

  

  

  

  

2.3.1 try語句  try語句用大括號{}指定了一段程式碼,該段程式碼可能會拋棄一個或多個例外。 2.3.2 catch語句  catch語句的引數類似於方法的宣告,包括一個例外型別和一個例外物件。例外型別必須為Throwable類的子類,它指明瞭catch語句所處理的例外型別,例外物件則由執行時系統在try所指定的程式碼塊中生成並被捕獲,大括號中包含物件的處理,其中可以呼叫物件的方法。 catch語句可以有多個,分別處理不同類的例外。Java執行時系統從上到下分別對每個catch語句處理的例外型別進行檢測,直到找到型別相匹配的catch語句為止。這裡,型別匹配指catch所處理的例外型別與生成的例外物件的型別完全一致或者是它的父類,因此,catch語句的排列順序應該是從特殊到一般。 也可以用一個catch語句處理多個例外型別,這時它的例外型別引數應該是這多個例外型別的父類,程式設計中要根據具體的情況來選擇catch語句的例外處理型別。  2.3.3 finally語句  try所限定的程式碼中,當拋棄一個例外時,其後的程式碼不會被執行。通過finally語句可以指定一塊程式碼。無論try所指定的程式塊中拋棄或不拋棄例外,也無論catch語句的例外型別是否與所拋棄的例外的型別一致,finally所指定的程式碼都要被執行,它提供了統一的出口。通常在finally語句中可以進行資源的清除工作。如關閉開啟的檔案等。 

3.try-catch-finally程式塊的執行流程以及執行結果比較複雜。 首先執行的是try語句塊中的語句,這時可能會有以下三種情況: 1.如果try塊中所有語句正常執行完畢,那麼finally塊的居於就會被執行,這時分為以下兩種情況: -->如果finally塊執行順利,那麼整個try-catch-finally程式塊正常完成。 -->如果finally塊由於原因R突然中止,那麼try-catch-finally程式塊的結局是“由於原因R突然中止(completes abruptly)” 2.如果try語句塊在執行過程中碰到異常V,這時又分為兩種情況進行處理: -->如果異常V能夠被與try相應的catch塊catch到,那麼第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執行;這時就會有兩種執行結果: -->如果catch塊執行正常,那麼finally塊將會被執行,這時分為兩種情況: -->如果finally塊執行順利,那麼整個try-catch-finally程式塊正常完成。 -->如果finally塊由於原因R突然中止,那麼try-catch-finally程式塊的結局是“由於原因R突然中止(completes abruptly)” -->如果catch塊由於原因R突然中止,那麼finally模組將被執行,分為兩種情況: -->如果如果finally塊執行順利,那麼整個try-catch-finally程式塊的結局是“由於原因R突然中止(completes abruptly)”。 -->如果finally塊由於原因S突然中止,那麼整個try-catch-finally程式塊的結局是“由於原因S突然中止(completes abruptly)”,原因R將被拋棄。 (注意,這裡就正好和我們的例子相符合,雖然我們在testEx2中使用throw e丟擲了異常,但是由於testEx2中有finally塊,而finally塊的執行結果是complete abruptly的(別小看這個用得最多的return,它也是一種導致complete abruptly的原因之一啊——後文中有關於導致complete abruptly的原因分析),所以整個try-catch-finally程式塊的結果是“complete abruptly”,所以在testEx1中呼叫testEx2時是捕捉不到testEx1中丟擲的那個異常的,而只能將finally中的return結果獲取到。 如果在你的程式碼中期望通過捕捉被呼叫的下級函式的異常來給定返回值,那麼一定要注意你所呼叫的下級函式中的finally語句,它有可能會使你throw出來的異常並不能真正被上級呼叫函式可見的。當然這種情況是可以避免的,以testEx2為例:如果你一定要使用finally而且又要將catch中throw的e在testEx1中被捕獲到,那麼你去掉testEx2中的finally中的return就可以了。 這個事情已經在OMC2.0的MIB中出現過啦:伺服器的異常不能完全被反饋到客戶端。) -->如果異常V沒有catch塊與之匹配,那麼finally模組將被執行,分為兩種情況: -->如果finally塊執行順利,那麼整個try-catch-finally程式塊的結局就是“由於丟擲異常V而突然中止(completes abruptly)”。 -->如果finally塊由於原因S突然中止,那麼整個try-catch-finally程式塊的結局是“由於原因S突然中止(completes abruptly)”,異常V將被拋棄。 3.如果try由於其他原因R突然中止(completes abruptly),那麼finally塊被執行,分為兩種情況: -->如果finally塊執行順利,那麼整個try-catch-finally程式塊的結局是“由於原因R突然中止(completes abruptly)”。 -->如果finally塊由於原因S突然中止,那麼整個try-catch-finally程式塊的結局是“由於原因S突然中止(completes abruptly)”,原因R將被拋棄。

相關文章