靜態綁定,異常

1.靜態綁定
由static,final,private修飾的方法,再有繼承、向上轉型,並且用向上轉型的對象調用被static,final,private修飾的重寫的方法時,這個過程稱爲靜態綁定。
static,final,private修飾的方法,java編譯器在編譯過程中,已經知道這些方法屬於哪些類或對象。

示例1:

public class Person{
private void say(){
System.out.println("這是父類的say()方法");
}
public static void main(String[]args){
Person person=new Son();
person.say();
}
}
class Son extends Person{
public void say(){
System.out.println("這是子類的say方法");
}
}

示例2:

public class Something{
public static void main(String[]args){
Other o=new Other();
new Something().addOne(o);
}
public void addOne(final Other o){
//o=new Other();
o.i++;
}
}
class Other{
public int i;
}

示例3:

class  A{
int s=1;
int getS(){
return s;
}
}
class B extends A{
int s=0;
int getS(){
return s;
}
}
public class TestDynaic{
public static void main(String[]args){
A a=new A();
a.s=11;
B b=new B();
b.s=22;
a=b;
System.out.println(a.s);//1
System.out.println(b.s);//22
System.out.println(a.getS());//22
System.out.println(b.getS());//22
}
}

2.IDE之 MyEclipse
開發工具:就是爲了提高開發的效率和質量,更加容易的去發佈或者部署一個項目。
開發工具就是讓我們學會如何使用一個軟件。
掌握MyEclipse的安裝和使用。
MyEclipse常用的快捷鍵:
alt+/ 可以自動補全
ctrl+d 刪除一行
ctrl+/註釋,再次點擊取消註釋

查看所有快捷鍵的方式  ctrl+shift+L

3.異常
概念:在程序運行時期,發生的不正常的事件
注意:
設計良好的程序應該在異常發生時提供處理這些不正常事件的方法,使程序不會因爲異常的發生
而阻斷或產生不可預見的結果。
Java語言使用異常處理機制爲程序提供了異常處理的能力

4.異常的處理機制
Java程序在執行過程中如果出現異常,會自動生成一個異常類對象,該異常對象將被自動提交給JVM,這個過程稱爲拋出(throw)異常。
當JVM接收到異常對象時,會尋找能處理這一異常的代碼並把當前異常對象交給其處理,這一過程稱爲捕獲(catch)異常和處理異常。
如果JVM找不到可以捕獲異常的代碼,則運行時系統將終止,相應的Java程序也將退出。

5.異常的分類
從嚴重性角度分爲:
Error(錯誤):Error級別的異常一般指非常嚴重的事件,無法通過代碼解決。例如:JVM內部報錯、資源耗盡
Exception(異常):該級別的異常指的是一般性的事件,能夠有機會通過代碼處理,讓程序恢復到正常的執行流程。
注意:程序員通常只能處理異常(Exception),而對錯誤(Error)無能爲力。

6.Exception的分類
從編程的角度Excepiton劃分兩大類;
1.非受檢異常:就是指在編譯期間不要求強制處理的異常。
java.lang.RuntimeException類以及子類都屬於非受檢異常
例如:
錯誤的類型轉換:java.lang.ClassCastException
數組下標越界:java.lang.ArrayIndexOutOfBoundsException
空指針訪問:java.lang.NullPointerException
算術異常(除0溢出):java.lang.ArithmeticException
2.受檢異常:就是指在編譯期間強制要求處理的異常。
沒有找到指定名稱的類:java.lang.ClassNotFoundException 
訪問不存在的文件:java.io.FileNotFoundException 
操作文件時發生的異常:java.io.IOException
操作數據庫時發生的異常:java.sql.SQLException

7.try和catch
try語句:存放的是可能發生異常的代碼,如果發生異常由catch進行處理
語法:
try{
}catch(異常類 異常對象){
異常對象.getMessage();該方法輸出的是異常的簡短信息
異常的堆棧信息通過:異常對象.printStackTrace();
}
注意:try和catch都不能單獨出現,try,catch要結合使用。
try下面可以有多個catch,但是異常父類只能出現在最後一個catch語句中。
    如果沒有異常產生,所有的catch段的代碼都會被忽略不執行。

8.try和finally

finally中的代碼表示任何情況都需要執行的代碼,一般finally適合做資源清理的工作。
finally不能單獨使用,也需要和try進行匹配使用。
如果try,catch,finally三者同時使用,finally一定要位於所有catch的下面。

9.throw和throws
throw能夠主動產生一個異常,throw只能出現在方法體中,語法:
throw new 異常類("參數");
注意:單獨使用throw沒有任何的實際意義。
throws使用來把方法體中產生的異常,拋出來。誰調用,誰負責處理異常,否則繼續拋出。
throws只能出現在方法簽名的後面,語法:
[訪問修飾符] 返回值類型 方法名稱(參數列表)throws 異常類1,異常類2{

}

10.異常實踐
1.觀察拋出的異常的名字和行號很重要。
2.儘量減小try語句塊的體積。
3.在處理異常時,應該打印出該異常的堆棧信息以方便調試。


本 章 練 習
1. 簡答題

(1) Java語言如何進行異常處理?關鍵字throws、throw、try、catch、finally分別代表什麼意義?在try塊中可以拋出異常嗎?
(2) 簡單描述一下Java中的異常處理機制的原理和應用。
(3) try語句塊裏有一個return語句,那麼緊跟在這個try語句塊後的finally語句塊裏的代碼會不會被執行?什麼時候被執行?在return語句之前還是之後被執行?
(4) error和exception有什麼區別?
(5) final、finally和finalize有什麼用法上的區別?
2. 上機題
(1) 編寫一個類ExceptionTest1,在main方法中使用try、catch、finally,要求:
① 在try塊中,編寫被零除的代碼。
② 在catch塊中,捕獲被零除所產生的異常,並且打印異常信息。
③ 在finally塊中,打印一條語句。
(2) 上機練習:寫一個自定義異常,實現數組越界異常信息。
(3) 請在IDE中創建如下所示的TestEx類,運行之後觀察輸出結果是什麼。

public class TestEx {
public static int test(int x) {
int i = 1;
try {
System.out.println("try塊中10/x之前");
i = 10 / x;
System.out.println("try塊中10/x之後");
return i;
} catch (Exception e) {
i = 100;
System.out.println("catch塊中......");
} finally {
i = 1000;
System.out.println("finally塊");
}
return i;
}
public static void main(String[] args) {
System.out.println(TestEx.test(1));
System.out.println(TestEx.test(0));
}
}
(4) 請在IDE中創建如下所示的TestEx類,運行之後觀察輸出結果是什麼。
public class TestReturnException {
public static void main(String[] args) {
try {
System.out.println("testReturn 的返回值爲: " + testReturn());
} catch (Exception e) {
e.printStackTrace();
}


}


public static int testReturn() throws RuntimeException {
int tmp = 0;
try {
System.out.println("try區域輸出");
// 這裏會導致出現一個運行態異常
int i = 4, j = 0;
tmp = i / j;
} catch (RuntimeException e) {
System.out.println("catch區域輸出");
e.printStackTrace();
// 異常被重新拋出,上層函數可以進一步處理此異常
throw e;
} finally {
System.out.println("finally區域輸出!");
// 注意,這裏有一個 return 語句
return tmp;
}

}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章