一、選擇題
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將被拋棄。