天天看點

權限修飾符,方法及異常了解一下

權限修飾符

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).方法工作後,是否有結果需要傳回給調用處-->傳回值

方法重載和重寫

重載:

  1. 方法名一緻,參數清單中參數的順序,類型,個數不同。
  2. 重載與方法的傳回值無關,存在于父類和子類,同類中。
  3. 可以抛出不同的異常,可以有不同修飾符

重寫:

  1. 參數清單必須完全與被重寫方法的一緻,傳回類型必須完全與被重寫方法的傳回類型一緻。
  2. 構造方法不能被重寫,聲明為final的方法不能被重寫,聲明為static的方法不能被重寫,但是能夠被再次聲明。 如果父類方法通路修飾符為 private 則子類不能重寫該方法。
  3. 通路權限不能比父類中被重寫的方法的通路權限更低。
  4. 重寫的方法能夠抛出任何非強制異常(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的使用的注意事項:

  1. 如果一個方法内抛出了編譯時異常, 那麼則必須要使用throws進行異常聲明
  2. 如果調用了一個使用throws聲明了異常的方法,那麼調用者如果進行try...catch(等會說), 那麼也需要使用throws進行異常聲明。
  3. 如果方法内抛出運作時異常,那麼無需使用throws進行聲明。
  4. 如果在一個方法内有可能抛出多個異常,那麼我們需要進行多個異常的聲明。
  5. 如果在一個方法内有可能抛出多個異常,那麼我們也可以直接聲明這些異常的父類異常。

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中的釋放連接配接)

繼承中方法重寫的異常注意事項

繼承關系中方法重寫時異常的注意事項:

  1. 如果父類方法沒有抛出異常,那麼子類重寫該方法時也不能抛出異常, 如果該方法中有異常,隻能try...catch
  2. 如果父類方法抛出了異常, 那麼子類重寫該方法時,可以抛,也可以不抛. 如果抛, 那麼要麼抛出和父類方法相同的異常,要麼抛出父類方法的子類異常。

上面的注意事項隻适用于編譯時異常。

多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中儲存的傳回值。

繼續閱讀