/**
- 異常(Exception)處理:程序運行期間的錯誤,如果程序發(fā)生異常那么程序會終止擎厢,不會執(zhí)行其他代碼
- 所有異常的根父類:Throwable 子類: Exception Erro
- 檢查性異常(checked exception)
? 若系統(tǒng)運行時可能產生該類異常朵夏,則必須寫出相應的處理代碼蔼啦,
否則無法通過編譯
? 非RuntimeException異常
? 非檢查性異常(unchecked exception)
? 若系統(tǒng)運行時可能產生該類異常,則不必在程序中聲明對該類
異常的處理仰猖,就可以編譯執(zhí)行
? RuntimeException:運行時異常
java中如何處理異常
1.自行處理 語法:try.....catch
2.回避異常 throws表示異常的聲明, 說明此方法有可能出現異常
語法:public返回值類型 方法名() throws 異常類型{} - 先處理小異常后處理大異常
- throw與throws的區(qū)別
- 1.人為的拋出異常捏肢,那么這個異常需要自己創(chuàng)建
- 2.throws異常的聲明,表示某個方法中有可能會出現異常饥侵,但在該方法中不處理(try.....catch)鸵赫,誰調用誰去處理
自定義異常:用Exception
final和finally的區(qū)別
finally是try catch中的關鍵字
/** - final(最終的):修飾變量、方法躏升、類
- 1.final修飾類:表示這個類是不能被繼承的
- 2.final修改方法:表示這個方法不能被重寫(覆蓋)的
- 3.final修飾變量:表示這是一個常量(只被賦值一次) 靜態(tài)常量:public static final 常量名一般都是大寫的
- @author Administrator
*/
- @author Administrator
*/
有return try catch finally的執(zhí)行順序
<pre class="js_message_plain ng-binding" ng-bind-html="message.MMActualContent" style="margin: 0px; font-family: inherit; font-size: inherit; white-space: pre-wrap; word-break: normal;">辩棒、不管有沒有出現異常,finally塊中代碼都會執(zhí)行膨疏;
2一睁、當try和catch中有return時,finally仍然會執(zhí)行佃却;
3者吁、finally是在return后面的表達式運算后執(zhí)行的(此時并沒有返回運算后的值,而是先把要返回的值保存起來饲帅,不管finally中的代碼怎么樣砚偶,返回的值都不會改變,任然是之前保存的值)洒闸,所以函數返回值是在finally執(zhí)行前確定的;
4均芽、finally中最好不要包含return丘逸,否則程序會提前退出,返回值不是try或catch中保存的返回值掀宋。
舉例:
情況1:try{} catch(){}finally{} return;
顯然程序按順序執(zhí)行深纲。
情況2:try{ return; }catch(){} finally{} return;
程序執(zhí)行try塊中return之前(包括return語句中的表達式運算)代碼;
再執(zhí)行finally塊劲妙,最后執(zhí)行try中return;
finally塊之后的語句return湃鹊,因為程序在try中已經return所以不再執(zhí)行。
情況3:try{ } catch(){return;} finally{} return;
程序先執(zhí)行try镣奋,如果遇到異常執(zhí)行catch塊币呵,
有異常:則執(zhí)行catch中return之前(包括return語句中的表達式運算)代碼,再執(zhí)行finally語句中全部代碼侨颈,
最后執(zhí)行catch塊中return. finally之后也就是4處的代碼不再執(zhí)行余赢。
無異常:執(zhí)行完try再finally再return.
情況4:try{ return; }catch(){} finally{return;}
程序執(zhí)行try塊中return之前(包括return語句中的表達式運算)代碼芯义;
再執(zhí)行finally塊,因為finally塊中有return所以提前退出妻柒。
情況5:try{} catch(){return;}finally{return;}
程序執(zhí)行catch塊中return之前(包括return語句中的表達式運算)代碼扛拨;
再執(zhí)行finally塊,因為finally塊中有return所以提前退出举塔。
情況6:try{ return;}catch(){return;} finally{return;}
程序執(zhí)行try塊中return之前(包括return語句中的表達式運算)代碼绑警;
有異常:執(zhí)行catch塊中return之前(包括return語句中的表達式運算)代碼;
則再執(zhí)行finally塊央渣,因為finally塊中有return所以提前退出计盒。
無異常:則再執(zhí)行finally塊,因為finally塊中有return所以提前退出痹屹。
最終結論:任何執(zhí)行try 或者catch中的return語句之前章郁,都會先執(zhí)行finally語句,如果finally存在的話志衍。
如果finally中有return語句暖庄,那么程序就return了,所以finally中的return是一定會被return的楼肪,
編譯器把finally中的return實現為一個warning培廓。
下面是個測試程序
public class FinallyTest
{
public static void main(String[] args) {
[System.out.println(new](https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?requrl=http%3A%2F%2FSystem.out.println(new&skey=%40crypt_b6c9ed12_a552344a3d3e6a202881fe7797021bb3&deviceid=e022228226527146&pass_ticket=undefined&opcode=2&scene=1&username=@22a6407b624c1a953fc178e91347993461fc58e285ef4cfd65403f2aad9d1477) FinallyTest().test());;
}
static int test()
{
int x = 1;
try
{
x++;
return x;
}
finally
{
++x;
}
}
}
結果是2。
在try語句中春叫,在執(zhí)行return語句時肩钠,要返回的結果已經準備好了,就在此時暂殖,程序轉到finally執(zhí)行了价匠。
在轉去之前,try中先把要返回的結果存放到不同于x的局部變量中去呛每,執(zhí)行完finally之后踩窖,在從中取出返回結果,
因此晨横,即使finally中對變量x進行了改變洋腮,但是不會影響返回結果。
它應該使用棧保存返回值手形。</pre>
[](javascript:; "表情") [](javascript:; "截屏") [<input type="file" name="file" class="webuploader-element-invisible" multiple="multiple" style="outline: 0px; padding: 0px; font-family: inherit; font-size: 16px; margin: 0px; position: absolute; clip: rect(1px, 1px, 1px, 1px); orphans: 2; white-space: normal; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">](javascript:; "圖片和文件")