文章目錄
一、枚舉
1. 定義
枚舉指由一組固定的常量組成的類型。
2. 實現
// 枚舉類
public enum Gender{
male,female
}
// 使用
public class Student{
Gender sex;
public Student(){
sex = Gender.male;
}
}
3. 意義
限定數據的取值,使數據更加安全,簡單,易於理解。
二、包裝類
1. 定義
每個基本類型在 java.lang 包中都有一個相應的包裝類。
2. 作用
包裝類把基本類型數據轉換爲對象,提供了一系列實用的方法。
集合不允許存放基本數據類型數據,存放數字時,要用包裝類型。
3. 分類
4. 構造包裝類的實例
所有包裝類都可將與之對應的基本數據類型作爲參數,來構造它們的實例:
public Type(type value)
// 示例
Integer i = new Integer(1);
除 Character 類外,其他包裝類可將一個字符串作爲參數構造它們的實例:
public Type(String value)
// 示例
Integer i = new Integer("123");
Boolean 類構造方法參數爲 String 類型時,若該字符串內容爲 true (不考慮大小寫),則該 Boolean對象表示 true ,否則表示 false 。
當 Number 包裝類構造方法參數爲 String 類型時,字符串不能爲 null ,且該字符串必須可解析爲相應的基本數據類型的數據,否則編譯通過,運行時 NumberFormatException 異常。
5. 包裝類轉爲基本類型
XXXValue():包裝類轉換成基本類型。
// 示例
Integer integerId = newInteger(25);
int intId = integerId. intValue();
6. 基本類型轉爲字符串
toString():以字符串形式返回包裝對象表示的基本類型數據。
// 示例
String sex = Character.toString('男');
String id = Integer.toString(25);
// 等同於
String sex = '男'+"";
String id = 25+"";
7. 字符串轉爲基本類型
parseXXX():把字符串轉換爲相應的基本數據類型數據(Character除外)。
// 示例
int num = Integer.parseInt("36");
boolean bool = Boolean.parseBoolean("false");
8. 基本類型或字符串轉爲包裝類
valueOf
8.1 基本類型轉爲包裝類
所有包裝類都有如下方法:
public static Type valueOf(type value)
// 示例
Integer intValue = Integer.valueOf(21);
8.2 字符串轉爲包裝類
除 Character 類外,其他包裝類都有如下方法:
public static Type valueOf(String s)
// 示例
Integer intValue = Integer.valueOf("21");
9. 拆箱和裝箱(基本類型和包裝類的自動轉換)
裝箱:基本類型轉換爲包裝類的對象:包裝類 . valueOf();。
拆箱:包裝類對象轉換爲基本類型的值:包裝類 . xxxValue();。
自動裝箱、拆箱:
// JDK1.5之前是不支持自動裝箱和自動拆箱的,定義 Integer對象,必須這樣
Integer i = new Integer(8);
// JDK1.5開始,提供了自動裝箱的功能,定義 Integer對象可以這樣
Integer i = 8;
// 自動拆箱
int n = i;
10. 包裝類的特點
- JDK1.5後,允許基本數據類型和包裝類型進行混合數學運算
- 包裝類並不是用來取代基本數據類型的
- 在基本數據類型需要用對象表示時使用
三、異常
1. 定義
異常就是在程序的運行過程中所發生的不正常的事件,它會中斷正在運行的程序。Java編程語言使用異常處理機制爲程序提供了錯誤處理的能力。
2. JAVA中如何進行異常處理
2. try-catch 塊
public void method(){
try {
// 代碼段 A
} catch (異常類型 變量e) {
// 對異常進行處理的代碼段 B
}
// 代碼段 C
}
使用 try-catch 塊捕獲異常,分爲三種情況:
- 若代碼段 A 未產生異常,則程序在執行完代碼段A後,直接執行代碼段 C 。
- 若代碼段 A 產生異常,則產生異常對象,若異常對象匹配正確,則繼續執行代碼段 B、C ;若異常對象匹配不正確,則程序中斷運行。
3. 在catch塊中處理異常
調用異常對象的方法輸出異常信息:
4. 多重CATCH塊
一段代碼可能會引發多種類型的異常,當引發異常時,會按順序來查看每個 catch 語句,並執行第一個與異常類型匹配的catch語句。執行其中一條 catch 語句後,其後catch 語句將被忽略。
// 示例
try {
// 代碼段(省略)
} catch (InputMismatchException e) {
System.err.println("被除數和除數必須是整數");
} catch (ArithmeticException e) {
System.err.println("除數不能爲零");
} catch (Exception e) {
System.err.println("其他未知異常");
}
5. finally 塊
在 try-catch 塊後加入 finally 塊,可以確保無論是否發生異常,finally 塊中的代碼總能被執行。
finally塊中語句不執行的唯一情況——異常處理代碼中執行 System.exit(1) 退出Java虛擬機
6. 常見的異常類型
異常是一種特殊的對象,類型爲 java.lang.Exception 或其子類。
- Throwable:Exception 和 Error 類的父類
- Error:僅靠程序本身無法恢復的嚴重錯誤
- Exception:由Java應用程序拋出和處理的非嚴重錯誤
- Checked 異常(下圖 Exception 左子樹):程序必須處理該類異常
- 運行時異常(下圖 Exception 右子樹):不要求程序必須對它們做出處理
7. 聲明異常
Java語言中通過 throws 聲明某個方法可能拋出的各種異常,若同時聲明多個異常,之間由逗號隔開。
public class Test7 {
// divide()方法沒有處理異常,而是聲明異常
public static void divide() throws Exception {
Scanner in = new Scanner(System.in);
System.out.print("請輸入被除數:");
int num1 = in.nextInt();
System.out.print("請輸入除數:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d",
num1, num2, num1/ num2));
}
// 方式1:調用者通過 try-catch 捕獲並處理異常
public static void main(String[] args) {
try {
divide();
}catch (Exception e) {
e.printStackTrace();
}
}
/* 方式2:調用者通過 throws 繼續聲明異常
public static void main(String[] args) throws Exception {
divide();
}
}
*/
8. 拋出異常
8.1 系統自動拋出的異常
所有系統定義的編譯和運行異常都可以由系統自動拋出,稱爲標準異常,並且 Java 強烈地要求應用程序進行完整的異常處理,給用戶友好的提示,或者修正後使程序繼續執行。
8.2 語句拋出的異常
用戶程序自定義的異常和應用程序特定的異常,必須藉助於 throws 和 throw 語句來定義拋出異常。
public class Person {
private String name = "";// 姓名
private int age = 0;// 年齡
private String sex = "男";// 性別
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
}else {
throw new Exception("性別必須是“男”或者“女”!");
}
}
public void print() {
System.out.println(this.name + "(" + this.sex
+ "," + this.age + "歲)");
}
}
public class Test8 {
public static void main(String[] args) {
Person person = new Person();
try {
person.setSex("Male");
person.print();
}catch (Exception e) {
e.printStackTrace();
}
}
}
9. throw 和 throws 的區別
9.1 throw
throw 是語句拋出一個異常。
語法:throw (異常對象);
throw e;
9.2 throws
throws 是方法可能拋出異常的聲明。(用在聲明方法時,表示該方法可能要拋出異常)
語法:(修飾符)(方法名)([參數列表])[throws(異常類)]{…}
public void doA(int a) throws Exception1,Exception3{......}
9.3 舉例
throws E1,E2,E3只是告訴程序這個方法可能會拋出這些異常,方法的調用者可能要處理這些異常,而這些異常 E1,E2,E3 可能是該函數體產生的。
throw則是明確了這個地方要拋出這個異常。
// 示例
void doA(int a) throws Exception1,Exception3{
try{
......
}catch(Exception1 e) {
throw e;
}catch(Exception2 e) {
System.out.println("出錯了!");
}
if(a!=b) {
throw new Exception3("自定義異常");
}
}
代碼塊中可能會產生3個異常( Exception1、Exception2、Exception3 )。
- 如果產生 Exception1 異常,則捕獲之後再拋出,由該方法的調用者去處理。
- 如果產生 Exception2 異常,則該方法自己處理了( 即 System.out.println(“出錯了!”); )。所以該方法就不會再向外拋出 Exception2 異常了,void doA() throws Exception1, Exception3 裏面的 Exception2 也就不用寫了。
- 而 Exception3 異常是該方法的某段邏輯出錯,程序員自己做了處理,在該段邏輯錯誤的情況下拋出異常 Exception3,則該方法的調用者也要處理此異常。
9.4 對比
-
throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。
throws 句用在方法聲明後面,表示再拋出異常,由該方法的調用者來處理。 -
throws 主要是聲明這個方法會拋出這種類型的異常,使它的調用者知道要捕獲這個異常。
throw 是具體向外拋異常的動作,所以它是拋出一個異常實例。 -
throws 說明你有那個可能、傾向。
throw 的話,那就是你把那個傾向變成真實的了。 -
兩者都是消極處理異常的方式,這裏的消極並不是說這種方式不好,只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。