許可權修飾符
private 修飾的函式或者成員變數,只能在類內部使用。
default(預設許可權) 修飾類,成員變數,成員方法,構造方法都能使用預設許可權,即不寫任何關鍵字
protected 修飾成員變數,成員方法,構造方法,不能修飾類(外部類,內部類不考慮),可以在類及其子類內使用。
public 修飾類,成員變數,成員方法,構造方法,可以被任意訪問。
修飾符 | 同類中 | 同一個包中(子類和無關類) | 不同包(子類) | 不同包(無關類) |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
預設 | Y | Y | N | N |
private | Y | N | N | N |
方法
1).定義方法的格式:
修飾符 返回值型別 方法名 (形參型別 變數名,形參型別 變數名,...,形參型別 變數名){
}
1).修飾符:
2).返回值型別:如果方法內部工作後會產生一個結果,並要將這個結果返回給呼叫程式碼, 這時就需要宣告返回值型別。
3).方法名:自定義;
4).形參型別 變數名:如果方法工作時,需要外部資料,這時就需要宣告形參。 它可以從方法外部接收資料。一個方法可以有多個形參,而且形參型別可以不同,根據方法需要。
2).注意事項:
1).定義的位置:類體中,方法外;
2).如果一個方法定義了非void的返回值型別,那麼此方法內部的任何一個程式碼分支必須要保證返回一個此型別的值,否則編譯錯誤:
public static int show(){//編譯錯誤,此方法沒有保證所有分支都有返回值
int a = 5;
if( a == 5){
return 1;
}
}
3).如果一個方法宣告瞭返回值型別為void,那麼這個方法絕對不能返回任何型別的值;
但可以寫"return;"語句,表示結束方法的執行:
public static void show(){
int a = 5;
if( a == 5){
return;//OK的。表示:結束方法的執行
}
}
return:表示結束方法;
break:表示:跳出迴圈;
注意:return;後面不能緊跟其它程式碼,無法被執行,編譯錯誤;
當我們需要定義方法時,要根據方法的功能,來明確兩件事:
1).方法工作時是否需要外部資料-->形參
2).方法工作後,是否有結果需要返回給呼叫處-->返回值
方法過載和重寫
過載:
- 方法名一致,引數列表中引數的順序,型別,個數不同。
- 過載與方法的返回值無關,存在於父類和子類,同類中。
- 可以丟擲不同的異常,可以有不同修飾符
重寫:
- 引數列表必須完全與被重寫方法的一致,返回型別必須完全與被重寫方法的返回型別一致。
- 構造方法不能被重寫,宣告為final的方法不能被重寫,宣告為static的方法不能被重寫,但是能夠被再次宣告。 如果父類方法訪問修飾符為 private 則子類不能重寫該方法。
- 訪問許可權不能比父類中被重寫的方法的訪問許可權更低。
- 重寫的方法能夠丟擲任何非強制異常(UncheckedException,也叫非執行時異常),無論被重寫的方法是否丟擲異常。但是,重寫的方法不能丟擲新的強制性異常,或者比被重寫方法宣告的更廣泛的強制性異常,反之則可以。
異常
異常的繼承體系以及異常的分類
1.異常繼承體系為:異常的根類是 java.lang.Throwable,其下有兩個子類:java.lang.Error 與 java.util.Exception 。而Exception又分為編譯時期異常:checked異常,與執行時期異常:runtime異常
2.請描述你對錯誤(Error)的理解
Error:表示不可修復的惡性的錯誤,只能通過修改程式碼規避錯誤的產生,通常是系統級別的,所以很嚴重。
3.請描述你對異常(Expection的理解)
Exception:表示可修復的良性(相對於錯誤)的異常,異常產生後程式設計師可以並且應該通過程式碼的方式糾正,使程式繼續執行,是必須要處理的。
4.請描述你對執行時異常(RuntimeException)的理解
執行時期異常:runtime異常。在執行時期,檢查異常.在編譯時期,執行異常不會編譯器檢測(不報錯)。
throw關鍵字手動丟擲異常
如果不希望自動丟擲異常,那麼我們可以使用throw關鍵字手動丟擲異常。
throw的作用: 手動丟擲一個異常物件。
throw的格式:
throw new 異常類名();
在建立異常物件的時候,可以在構造方法中給出異常資訊。
throws關鍵字的使用
throw: 用來手動丟擲一個異常。
throws: 表示進行異常宣告, 宣告這個方法是有可能丟擲異常的。
throws的使用格式:
修飾符 返回值型別 方法名(引數列表) throws 異常類名{
方法體;
}
throws的使用的注意事項:
- 如果一個方法內丟擲了編譯時異常, 那麼則必須要使用throws進行異常宣告
- 如果呼叫了一個使用throws宣告瞭異常的方法,那麼呼叫者如果進行try...catch(等會說), 那麼也需要使用throws進行異常宣告。
- 如果方法內丟擲執行時異常,那麼無需使用throws進行宣告。
- 如果在一個方法內有可能丟擲多個異常,那麼我們需要進行多個異常的宣告。
- 如果在一個方法內有可能丟擲多個異常,那麼我們也可以直接宣告這些異常的父類異常。
try...catch的使用
之前處理異常的方式都是甩鍋, 把異常拋給呼叫者, 除了可以把異常拋給呼叫者之外,我們可以使用try...catch解決這個異常
try...catch: 表示捕獲處理, 表示真正解決掉了這個異常。
try...catch格式:
try {
可能會出現問題的程式碼
} catch(異常類名 變數名) {
出現異常後執行的程式碼
}
try...catch的執行流程
第一種情況: 如果try中的程式碼沒有遇到問題, 那麼程式碼會跳過catch繼續往下執行。
第二種情況: 如果try中的程式碼出現了異常, 並且catch捕獲到了這個異常,程式碼會從try直接執行到catch。
第三種情況: 如果try中的程式碼出現了異常,但是catch沒有捕獲到, 這個異常會依舊往外拋,拋給呼叫者。
小結:
異常處理有兩種方式:1. 往外拋(甩鍋): throw, throws 2. 決異常: try...catch
finally程式碼塊
try...catch後面可以在追加一個finally,finally中的程式碼,無論如何都會執行。
格式:
try {
【A:可能會出現問題的程式碼】
} catch (要捕獲的異常類名 變數名) {
【B:出現異常會執行的程式碼】
} finally {
【C: 一定會執行的程式碼】
}
執行流程:
第一種情況: 如果try中的程式碼沒有問題, 那麼執行流程為【A】【C】
第二種情況: 如果try中的程式碼有異常,並且catch捕獲到了這個異常, 那麼執行流程為:【A】【B】【C】
第三種情況: 如果try中的程式碼有異常,但是catch沒有捕獲到這個異常,那麼執行流程為:【A】【C】 丟擲異常
finally中的程式碼一定會執行, 通常finally中的程式碼都用作資源回收(IO流中的關閉流, JDBC中的釋放連線)
繼承中方法重寫的異常注意事項
繼承關係中方法重寫時異常的注意事項:
- 如果父類方法沒有丟擲異常,那麼子類重寫該方法時也不能丟擲異常, 如果該方法中有異常,只能try...catch
- 如果父類方法丟擲了異常, 那麼子類重寫該方法時,可以拋,也可以不拋. 如果拋, 那麼要麼丟擲和父類方法相同的異常,要麼丟擲父類方法的子類異常。
上面的注意事項只適用於編譯時異常。
多catch處理的注意事項
如果要使用try...catch語句捕獲多個異常,那麼可以在這個語句後面跟上多個catch
try {
可能會出現問題的程式碼
} catch(要捕獲的異常類 變數名) {
出現該異常後的處理方式
} catch(要捕獲的異常類 變數名) {
出現該異常後的處理方式
} catch(要捕獲的異常類 變數名) {
出現該異常後的處理方式
}
執行流程:
1. 會先執行try中的程式碼。
2. 如果try中的程式碼沒有異常,那麼所有的catch都不會執行。
3. 如果try中的程式碼有異常,那麼哪個catch先捕獲到這個異常,那麼就執行哪個catch中的語句。 剩下的catch就不再執行了
注意事項:如果使用catch捕獲多個異常,那麼父類異常不能放在子類異常的前面。
Throwable的常見方法
在Throwable中有一些方法可以獲取到異常資訊。
void printStackTrace(): 將詳細的異常資訊進行輸出。
String getMessage(): 獲取簡單異常資訊,並將該異常資訊返回。
try {
可能會出現問題的程式碼
} catch(要捕獲的異常類 變數名) {
出現該異常後的處理方式
//呼叫printStackTrace輸出異常資訊 e.printStackTrace();
//String getMessage(): 獲取簡單異常資訊,並將該異常資訊返回。
}
上面的方法不能直接建立物件,然後去呼叫,需要放在catch中去使用
try,catch,finally
異常處理中,try、catch、finally的執行順序,大家都知道是按順序執行的。如果try中沒有異常,則順序為try→finally,如果try中有異常,則順序為try→catch→finally。
1、不管有沒有出現異常,finally塊中程式碼都會執行;
2、當try和catch中有return時,finally仍然會執行;
3、finally是在return後面的表示式運算後執行的(此時並沒有返回運算後的值,而是先把要返回的值儲存起來,不管finally中的程式碼怎麼樣,返回的值都不會改變,仍然是之前儲存的值),所以函式返回值是在finally執行前確定的;
4、finally中最好不要包含return,否則程式會提前退出,返回值不是try或catch中儲存的返回值。