異常與異常處理
1、Java異常機制用到的幾個關鍵字:try、catch、finally、throw、throws
try -- 用於監聽。將要被監聽的代碼(可能拋出異常的代碼)放在try語句塊之內,當try語句塊內發生異常時,異常就被拋出。
catch -- 用於捕獲異常。catch用來捕獲try語句塊中發生的異常。
finally -- finally語句塊總是會被執行。它主要用於回收在try塊裏打開的物力資源(如數據庫連接、網絡連接和磁盤文件)。只有 finally塊,執行完成之後,纔會回來執行try或者catch塊中的return或者throw語句,如果finally中使用了return或者throw 等終止方法的語句,則就不會跳回執行,直接停止。
throw -- 用於拋出異常。
throws -- 用在方法簽名中,用於聲明該方法可能拋出的異常。主方法上也可以使用throws拋出。如果在主方法上使用了throws 拋出,就表示在主方法裏面可以不用強制性進行異常處理,如果出現了異常,就交給JVM進行默認處理,則此時會導 致程序中斷執行。
2、三種類型的異常
檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。例如要打開一個不存在文件時, 一個異常就發生了,這些異常在編譯時不能被簡單地忽略
運行時異常:運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略。
錯誤:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們 在編譯也檢查不到的
3、異常的根接口Throwable,其下有2個子接口,Error和Exception。
Error:指的是JVM錯誤,這時的程序並沒有執行,無法處理;
Exception:指的是程序運行中產生的異常,用戶可以使用處理格式處理。
4、異常的處理方案
try...catch、try...catch...finally、try...finally
try{
可能會發生的異常
}catch(異常類型 異常名(變量)){
針對異常進行處理的代碼
}catch(異常類型 異常名(變量)){
針對異常進行處理的代碼
}...
[finally{
釋放資源代碼;
}]
注意:
catch 不能獨立於 try 存在。
catch裏面不能沒有內容
在 try/catch 後面添加 finally 塊並非強制性要求的。
try 代碼後不能既沒 catch 塊也沒 finally 塊。
try裏面越少越好。
try, catch, finally 塊之間不能添加任何代碼。
finally裏面的代碼最終一定會執行(除了JVM退出)
如果程序可能存在多個異常,需要多個catch進行捕獲。
異常如果是同級關係,catch誰前誰後沒有關係
如果異常之間存在上下級關係,上級需要放在後面
5、自定義異常
在 Java 中你可以自定義異常。如果要自定義異常類,則擴展Exception類即可,因此這樣的自定義異常都屬於檢查異常(checked exception)。如果要自定義非檢查異常,則擴展自RuntimeException。
按照國際慣例,自定義的異常應該總是包含如下的構造函數
- 一個無參構造函數
- 一個帶有String參數的構造函數,並傳遞給父類的構造函數。
- 一個帶有String參數和Throwable參數,並都傳遞給父類構造函數
- 一個帶有Throwable 參數的構造函數,並傳遞給父類的構造函數。
下面是IOException類的完整源代碼,可以借鑑。
finally塊和return
(1)、首先一個不容易理解的事實:在 try塊中即便有return,break,continue等改變執行流的語句,finally也會執行。
(2)、finally中的return 會覆蓋 try 或者catch中的返回值。
(3)、finally中的return或異常會抑制(消滅)前面try或者catch塊中的異常。
Java中的字符串
1、String
(1)、String對象創建後則不能修改,是不可變的,所謂的修改是創建了新的對象,所指向內存空間不同。
(2)、一旦一個字符串在內存中創建,則這個字符串將不可改變。如果需要一個可以改變的字符串,我們可以使用StringBuffer或 者StringBuilder
(3)、每次 new 一個字符串就是產生一個新的對象,即便兩個字符串的內容相同,使用 ”==” 比較時也爲 ”false” ,如果只需比較內 容是否相同,應使用 ”equals()” 方法,對象實體比較,通過重寫Object中的equals方法來比較。
(4)、String常用的類
字符串 str 中字符的索引從0開始,範圍爲 0 到 str.length()-1;使用 indexOf 進行字符或字符串查找時,如果匹配返回位置 索引;如果沒有匹配結果,返回 -1
(5)、“==” 和 equals() 有什麼區別:
”==“是判斷兩個字符串在內存中首地址是否相同,即判斷是否是同一個字符串對象。
”equals“比較存儲在兩個字符串對象中的內容是否一致。
字節是計算機存儲信息的基本單位,1 個字節等於 8 位, gbk 編碼中 1 個漢字字符存儲需要 2 個字節,1 個英文字符存儲 需要 1個字節。
2、StringBuilder 或 StringBuffe
當頻繁操作字符串,不停的創建對象就會額外產生很多的臨時變量,使用StringBuilder 或 StringBuffe就會避免這個問題。至於 StringBuilder 和StringBuffer ,它們基本相似,不同之處,StringBuffer 是線程安全的,而 StringBuilder 則沒有實現線程安全功 能,所以性能略高。因此一般情況下,如果需要創建一個內容可變的字符串對象,應優先考慮使用 StringBuilder 類。
Java中必須瞭解的常用類
1、包裝類
基本數據類型是不具備對象的特性的,比如基本類型不能調用方法、功能簡單。。。,爲了讓基本數據類型也具備對象的特 性,Java爲每個基本數據類型都提供了一個包裝類,這樣我們就可以像操作對象那樣來操作基本數據類型。
包裝類主要提供兩大類的方法:
(1)、將本類型和其他基本類型進行轉換的方法
(2)、將字符串和基本類型及包裝類互相轉換的方法
2、日期類:Date(java.util) 和 SimpleDateFormat(java.text)
(1)、使用 format() 方法將日期轉換爲指定格式的文本
(2)、使用 parse() 方法將文本轉換爲日期(調用 SimpleDateFormat 對象的 parse() 方法時可能會出現轉換異常,即 ParseException , 因此需要進行異常處理)
3、Calendar 類(處理日期)
(1)、java.util.Calendar 類是一個抽象類,可以通過調用 getInstance() 靜態方法獲取一個 Calendar 對象,此對象已由當前日期時 間初始化,即默認代表當前時間,如 Calendar c = Calendar.getInstance();
4、Math 類
Math 類位於 java.lang 包中,包含用於執行基本數學運算的方法, Math 類的所有方法都是靜態方法,所以使用該類中的方法 時,可以直接使用類名.方法名,如: Math.round()