日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

classcastexception异常_内部类、异常以及 LeetCode 每日一题

發布時間:2023/12/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 classcastexception异常_内部类、异常以及 LeetCode 每日一题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 內部類

內部類的作用:

  • 內部類提供了更好的封裝,可以把內部類隱藏于外部類之內,不允許同一個包中的其他類訪問該類。(例如給“牛”這個類組合一個“牛腿”,則可以把牛腿定義成內部類,因為牛腿脫離了牛沒有意義)
  • 內部類成員可以直接訪問外部類私有數據,因為內部類被當成其外部類成員。
  • 匿名內部類適合用于創建僅需要使用一次的類。

內部類除了必須定義在其他類里面之外,還有如下區別:

  • 內部類可以比外部類多使用三個修飾符:private 、protected 、static (被當作成員)
  • 非靜態內部類不能擁有靜態成員。

成員內部類(方法外,外部類里面定義的)的 class 文件的格式是 OuterClass$InnerClass.class。

1.1 非靜態內部類

當調用非靜態內部類的實例方法時,必須有一個非靜態內部類實例,而非靜態內部類實例必須寄生在外部類實例里。

  • 非靜態內部類方法訪問某個變量時:優先在方法內尋找局部變量;接著在內部類找;接著在外部類找;如果依然不存在,則編譯錯誤,提示找不到改變量。如果外部類成員變量、內部類成員變量、局部變量同名,則可以用 外部類名.this.val、this.val、val 來區分。
  • 如果外部類需要訪問非靜態內部類的成員,則必須顯示創建非靜態內部類對象來調用訪問其實例成員。
  • 外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例等。
  • 非靜態內部類里不能有靜態方法、靜態成員變量、靜態代碼塊。(可以有普通初始化塊)

1.1.1 創建非靜態內部類實例

  • 在外部類中,可以直接按照普通的創建對象的形式創建內部類實例
  • 在其它類中,需要先創建外部類實例,再通過外部類實例創建內部類實例,內部類實例寄生于外部類實例。
OuterClass outer = new OuterClass(); (OuterClass.)InnerClass inner = outer.new Inner(); 或 (OuterClass.)InnerClass inner = new OuterClass().new Inner();

1.2 靜態內部類

使用 static 來修飾一個內部類,則這個內部類就屬于外部類本身。靜態內部類可以包含靜態成員,也可以包含非靜態成員,但是靜態內部類不能訪問外部類的實例成員,只能訪問外部類的類成員。

靜態內部類是外部類的一個靜態成員,因此外部類的所有方法、所有初始化塊中可以使用靜態內部類來定義變量、創建對象。

外部類依然不能直接訪問靜態內部類的成員,但可以通過類名(或對象)作為調用者訪問靜態內部類的成員。

PS Java 還允許在接口里定義內部類,接口里的內部類默認是 public static 修飾

1.2.1 創建靜態內部類實例

  • 在外部類中,可以直接按照普通的創建對象的形式創建內部類實例
  • 其他類中:
(OuterClass.)InerClass iner = new (OuterClass.)InnerClass();

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:數學計算異常。比如除數為0
InputMismatchException:輸入不匹配異常
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 每日一题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。