Java基礎 -- 枚舉、包裝類、異常

一、枚舉

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 的話,那就是你把那個傾向變成真實的了。

  • 兩者都是消極處理異常的方式,這裏的消極並不是說這種方式不好,只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。

發佈了18 篇原創文章 · 獲贊 25 · 訪問量 960
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章