筆試題
java處理異常採用try-catch-finally語句捕獲處理異常,finally常用來處理一些後續的工作,今天遇到了一個很容易錯的知識點,我覺得有必要寫點東西做一個總結。
先提一下return語句的用法,return不管實在c語言還是在c++中都是返回函數值的語句。我們都知道return語句的一般作用:
(1)向方法返回一個值;
(2)結束當前的方法。
並且當一個方法中有多個return時,會按照執行的順序只執行第一個return,當然最終的函數傳回值也是第一個執行的值。因為當執行第一個return語句後該方法就運行結束了。
但是請看下面的一個java的代碼,讀者也可先預想一下結果:
public class Test { public static void main(String[] args) { System.out.println(test(null) + "," + test("0") + "," + test("")); } public static int test(String str) { try { return str.charAt(0) - '0'; } catch (NullPointerException e1) { return 1; } catch (StringIndexOutOfBoundsException e2) { return 2; } catch (Exception e3) { return 3; } finally { return 4; } }
答案是: 4,4,4
不知道你有沒有做對,反正我是做錯了,慚愧。
下面附上執行的結果(添加了異常資訊的輸出方法的結果,方便查看):
java.lang.NullPointerException at cn.test.example.Test.test(Test.java:14) at cn.test.example.Test.main(Test.java:9)java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(String.java:646) at cn.test.example.Test.test(Test.java:14) at cn.test.example.Test.main(Test.java:9)4,4,4
輸出結果分析:
在java的的finally首先必須使用在所有catch的最後位置,其次他是必須執行的,無條件執行的,即使前面的try-catch語句中已經存在異常了,它仍然會執行。最然後不明白的就是當調用 tets(“null”)時會有NullPointerException類型的異常,並且會執行後面return 1;按照常理來說,運行到此處的return該方法就會結束運行了,但是看結果顯示不是。原來finally語句前雖然運行了return語句,但是因為finally用法特殊,所以會在撤銷之前的return語句,繼續執行最後的finally塊中的代碼,所以最後的結果是4,4,4.
雖然是個小問題,但是比較容易出錯,所以在此作以說明。
轉載請說明出處:http://blog.csdn.net/yyg_2015/article/details/52188066