classcastexception异常_内部类、异常以及 LeetCode 每日一题
1 內部類
內部類的作用:
- 內部類提供了更好的封裝,可以把內部類隱藏于外部類之內,不允許同一個包中的其他類訪問該類。(例如給“牛”這個類組合一個“牛腿”,則可以把牛腿定義成內部類,因為牛腿脫離了牛沒有意義)
- 內部類成員可以直接訪問外部類私有數據,因為內部類被當成其外部類成員。
- 匿名內部類適合用于創建僅需要使用一次的類。
內部類除了必須定義在其他類里面之外,還有如下區別:
- 內部類可以比外部類多使用三個修飾符:private 、protected 、static (被當作成員)
- 非靜態內部類不能擁有靜態成員。
成員內部類(方法外,外部類里面定義的)的 class 文件的格式是 OuterClass$InnerClass.class。
1.1 非靜態內部類
當調用非靜態內部類的實例方法時,必須有一個非靜態內部類實例,而非靜態內部類實例必須寄生在外部類實例里。
- 非靜態內部類方法訪問某個變量時:優先在方法內尋找局部變量;接著在內部類找;接著在外部類找;如果依然不存在,則編譯錯誤,提示找不到改變量。如果外部類成員變量、內部類成員變量、局部變量同名,則可以用 外部類名.this.val、this.val、val 來區分。
- 如果外部類需要訪問非靜態內部類的成員,則必須顯示創建非靜態內部類對象來調用訪問其實例成員。
- 外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例等。
- 非靜態內部類里不能有靜態方法、靜態成員變量、靜態代碼塊。(可以有普通初始化塊)
1.1.1 創建非靜態內部類實例
- 在外部類中,可以直接按照普通的創建對象的形式創建內部類實例
- 在其它類中,需要先創建外部類實例,再通過外部類實例創建內部類實例,內部類實例寄生于外部類實例。
1.2 靜態內部類
使用 static 來修飾一個內部類,則這個內部類就屬于外部類本身。靜態內部類可以包含靜態成員,也可以包含非靜態成員,但是靜態內部類不能訪問外部類的實例成員,只能訪問外部類的類成員。
靜態內部類是外部類的一個靜態成員,因此外部類的所有方法、所有初始化塊中可以使用靜態內部類來定義變量、創建對象。
外部類依然不能直接訪問靜態內部類的成員,但可以通過類名(或對象)作為調用者訪問靜態內部類的成員。
PS Java 還允許在接口里定義內部類,接口里的內部類默認是 public static 修飾1.2.1 創建靜態內部類實例
- 在外部類中,可以直接按照普通的創建對象的形式創建內部類實例
- 其他類中:
1.3 局部內部類
聲明周期和所在方法相同,生成 class 文件 格式為:OuterClass$NInnerClass.class。對比成員內部類,多了一個數字(N),因為同一個類了里可能有兩個以上同名的局部內部類。
局部內部類若訪問了局部變量(方法中定義的),則會自動給改變量加上 final 修飾符,意味著不能修改局部變量的值。
1.4 匿名內部類
適合創建只需要使用一次的類,定義格式如下:
new 實現接口()|父類構造器(實參列表){ //類體 }匿名內部類必須繼承一個父類,或實現一個接口,且最多繼承一個父類或實現一個接口。
規則:
- 匿名內部類不能是抽象類
- 不能定義構造器,但可以定義初始化塊,來完成構造器的工作。
當通過實現接口創建匿名內部類時,括號里不能有參數;
當通過繼承父類來創建匿名內部類時,將擁有和父類相似的父類構造器(相同的形參列表),會根據參數列表調用父類構造器。類體里可以重寫父類的普通方法。
同樣的匿名內部類訪問局部變量時,會自動添加 final 修飾。
2 異常處理
2.1 異常
異常是指在程序的運行過程中所發生的不正常的情況,它會中斷正在運行的程序。java中通過異常處理機制為程序提供異常處理的能力,保持程序繼續運行而不中斷!
涉及異常處理的常用關鍵字有:try、catch、finally、throws、throw
2.2 try - catch
把有可能產生異常的代碼放到try代碼塊中,catch代碼塊負責捕獲并處理異常。
Exception是所有異常類的直接或者間接父類。往下又分為 RuntimeException 和 檢查時異常。檢查時異常要求編譯時必須對其進行異常處理,而 RuntimeException 沒有要求。
運行時異常:包括RuntimeException及其所有子類。不要求程序必須對它們作出處理,比如InputMismatchException、ArithmeticException、NullPointerException等。即使沒有使用try-catch或throws進行處理,仍舊可以進行編譯和運行。如果運行時發生異常,會輸出異常的堆棧信息并中止程序執行。
Checked異常(非運行時異常):除了運行時異常外的其他異常類都是Checked異常。程序必須捕獲或者聲明拋出這種異常,否則出現編譯錯誤,無法通過編譯。處理方式包括兩種:通過try-catch捕獲異常,通過throws聲明拋出異常從而交給上一級調用方法處理
常見的運行時異常
ArithmeticException:數學計算異常。比如除數為0InputMismatchException:輸入不匹配異常
ArrayIndexOutofBoundsException:數組下標越界異常。
NullPointException:空指針異常,對象沒有初始化就使用時,jvm會拋出該異常
IllegalArgumentException:非法參數異常。
ClassCastException:強制類型轉換異常。
NumberFormatException:數字格式化異常。比如把“abc”格式化成數字。
常見的檢查時異常:
ClassNotFoundException:類沒有被發現異常。SQLException:數據庫相關異常
IOException:IO操作異常
ParseException:解析錯誤異常
FileNotFoundException:文件未發現異常。
當 catch 后面的參數和發生的異常類型不匹配時,捕獲異常失敗,程序會終止,并由系統拋出異常提示。
可以采用多重 catch ,分別對不同類型的異常進行處理,類似于 if - else if。
2.3 try - catch - finally
把有可能產生異常的代碼放到try中,catch負責匹配并處理異常,finally塊用于進行收尾工作(關閉數據庫、關閉文件、釋放內存等資源),不管是否發生異常,finally內的代碼都將執行。只有一種情況下不執行 finally 內的代碼:在 try 或 catch 內部用 System.exit(0); 退出 JVM,finally 將沒機會執行。
可以省略掉 catch,捕獲到異常之后不對異常進行任何處理,直接進入 finally。
若有 return 關鍵字在 try - catch - fianlly 內部,系統的執行順序總是執行到 return 的前一句, 接著執行完 finally 內部代碼后再 return,不管 return 是存在于 try 還是 catch。
2.4 聲明異常
2.4.1 throws 關鍵字
當一個方法可能存在異常,而此時自身又無法更好的處理,可以交給外界處理。此時用throws聲明并拋出異常。開發者可以根據需要聲明檢查時異常(Exception或者非運行時異常)和運行時異常(RuntimeException或其子類)。如果調用處也不知道如何處理異常,可選擇繼續聲明異常,我們把這個過程稱為異常上拋,繼續 throws。
2.4.2 聲明異常與方法重載、重寫
方法的重載完全不會受到聲明異常的影響,若類中某一方法聲明了異常,其重載的方法聲不聲明異常都可以。
但是重寫不一樣,以下四種情況都是合法的:
2.5 手動拋出異常
除了系統自動拋出異常外,有些問題需要開發者手動拋出異常。使用關鍵字 throw
public void setGender(String gender) throws Exception{if(gender.equals("男") || gender.equals("女")) { this.gender = gender;}else {throw new Exception("性別不合法!");}}2.6 自定義異常
如果開發者需要手動拋出的異常在系統不存在,可以自定義異常。如果要自定義異常,首先要確定異常類型,如果異常是運行時異常,必須繼承 RuntimeException 或其子類;如果異常是檢查時異常,必須繼承 Exception 或其子類。異常的命名方式,參考系統命名方式,以Exception結尾。
public class AgeException extends Exception{public AgeException() {super();}public AgeException(String message) {super(message);} }3 LeetCode
58. 最后一個單詞的長度
給定一個僅包含大小寫字母和空格 ' ' 的字符串,返回其最后一個單詞的長度。如果不存在最后一個單詞,請返回 0 。
說明:一個單詞是指由字母組成,但不包含任何空格的字符串。
示例:
輸入: "Hello World" 輸出: 5源碼:
class Solution {public int lengthOfLastWord(String s) {int num = 0;for(int i = s.length() - 1; i >= 0; i--){if (s.charAt(i) == ' ' && num == 0)continue;if (s.charAt(i) != ' ')num++;else break;}return num;} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的classcastexception异常_内部类、异常以及 LeetCode 每日一题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宁德时代麒麟电池已量产 同体积比特斯拉电
- 下一篇: 24 期免息 + 30 天无忧退:OPP