Java包裝類與異常處理的過程
在 Java 開發(fā)中,包裝類和異常處理是兩個(gè)核心且高頻的知識(shí)點(diǎn)。它們分別解決了基本數(shù)據(jù)類型的對(duì)象化問題,以及程序運(yùn)行時(shí)的錯(cuò)誤處理問題。
本文將結(jié)合代碼示例,深入解析這兩個(gè)概念,幫助你更好地理解和運(yùn)用。
一、包裝類:讓基本數(shù)據(jù)類型 “對(duì)象化”
1. 什么是包裝類?
Java 中的數(shù)據(jù)類型從本質(zhì)上分為兩類:
- 基本數(shù)據(jù)類型:
byte,short,int,long,float,double,char,boolean。它們不是對(duì)象,在面向?qū)ο缶幊痰哪承﹫?chǎng)景(如集合操作)中會(huì)受到限制。 - 引用類型:通過
new關(guān)鍵字創(chuàng)建的對(duì)象。
為了讓基本數(shù)據(jù)類型也能以對(duì)象的形式存在,Java 提供了一組包裝類,專門用來創(chuàng)建與 8 種基本數(shù)據(jù)類型對(duì)應(yīng)的對(duì)象。
2. 基本數(shù)據(jù)類型與包裝類的對(duì)應(yīng)關(guān)系
| 基本數(shù)據(jù)類型 | 包裝類 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
這些包裝類全部存放于 java.lang 包中,它們的繼承關(guān)系如下:
- 一級(jí)父類:
Object - 二級(jí)父類:
Character,Number,Boolean Number的子類:Byte,Short,Integer,Long,Float,Double
public class Test {
public static void main(String[] args) {
byte b = 1;
Byte byt = new Byte(b);
short s = 2;
Short shor = new Short(s);
int i = 3;
Integer integer = new Integer(i);
long l = 4;
Long lon = new Long(l);
float f = 5.5f;
Float flo = new Float(f);
double d = 6.6;
Double dou = new Double(d);
char cha = 'J';
Character charac = new Character(cha);
boolean bo = true;
Boolean bool = new Boolean(bo);
}
}注意:從 Java 5 開始,引入了自動(dòng)裝箱(Autoboxing)功能,編譯器會(huì)自動(dòng)完成這個(gè)轉(zhuǎn)換,例如 Integer i = 3;。
拆箱:包裝類 → 基本數(shù)據(jù)類型
將包裝類對(duì)象轉(zhuǎn)換回對(duì)應(yīng)的基本數(shù)據(jù)類型。
public class Test {
public static void main(String[] args) {
byte b = 1;
Byte byt = new Byte(b);
byte b1 = byt.byteValue();
short s = 2;
Short shor = new Short(s);
short i1 = shor.shortValue();
int i = 3;
Integer integer = new Integer(i);
int i2 = integer.intValue();
long l = 4;
Long lon = new Long(l);
long l1 = lon.longValue();
float f = 5.5f;
Float flo = new Float(f);
float v = flo.floatValue();
double d = 6.6;
Double dou = new Double(d);
double v1 = dou.doubleValue();
char cha = 'J';
Character charac = new Character(cha);
char c = charac.charValue();
boolean bo = true;
Boolean bool = new Boolean(bo);
boolean b2 = bool.booleanValue();
}
}注意:同樣,Java 5 也引入了自動(dòng)拆箱(Unboxing)功能,例如 int i = new Integer(3);。
二、異常處理:讓程序 “優(yōu)雅” 地應(yīng)對(duì)錯(cuò)誤
1. 什么是異常?
Java 中的錯(cuò)誤可以分為兩大類:
- 編譯時(shí)錯(cuò)誤:一般指語法錯(cuò)誤,編譯器會(huì)在編譯階段就提示,無法生成
.class文件。 - 運(yùn)行時(shí)錯(cuò)誤:語法沒有問題,可以正常通過編譯,但在運(yùn)行時(shí)報(bào)錯(cuò)。
異常就是 Java 提供的一套機(jī)制,用來專門處理各種運(yùn)行時(shí)錯(cuò)誤。它會(huì)將具體的錯(cuò)誤信息以及出錯(cuò)位置統(tǒng)一告知程序員,幫助我們快速定位和解決問題。
2. 常見的異常類型
Java 內(nèi)置了豐富的異常類,以下是幾個(gè)最常見的:
ArithmeticException:數(shù)學(xué)異常,如除數(shù)為零。
System.out.println(10 / 0); // 拋出此異常
ClassNotFoundException:類未定義異常,當(dāng)嘗試加載一個(gè)不存在的類時(shí)拋出。
System.out.println(Class.forName("Test2"));IllegalArgumentException:參數(shù)格式異常,當(dāng)傳遞了不合法或不恰當(dāng)?shù)膮?shù)時(shí)拋出。
public void test(Integer integer) {
System.out.println(integer);
}
// 當(dāng)通過反射調(diào)用此方法并傳入字符串 "1" 時(shí)會(huì)拋出此異常ArrayIndexOutOfBoundsException:數(shù)組下標(biāo)越界異常。
int[] array = {1, 2, 3};
System.out.println(array[3]); // 數(shù)組長(zhǎng)度為3,索引最大為2NullPointerException:空指針異常,當(dāng)調(diào)用一個(gè)null對(duì)象的方法或?qū)傩詴r(shí)拋出。
Integer num = null; System.out.println(num.equals(1));
NoSuchMethodException:方法未定義異常,當(dāng)嘗試調(diào)用一個(gè)不存在的方法時(shí)拋出。NumberFormatException:將其他數(shù)據(jù)類型轉(zhuǎn)換為數(shù)值類型時(shí)的不匹配異常。
Integer integer = new Integer("a"); // 字符串 "a" 無法轉(zhuǎn)換為整數(shù)3. 異常的使用:try-catch-finally
Java 提供了 try-catch-finally 語句塊來捕獲和處理異常。
try:監(jiān)聽可能會(huì)拋出異常的代碼。一旦出現(xiàn)錯(cuò)誤,JDK 會(huì)自動(dòng)創(chuàng)建一個(gè)錯(cuò)誤對(duì)象(異常對(duì)象)。catch:用來捕獲 JDK 創(chuàng)建的異常對(duì)象,并進(jìn)行后續(xù)的處理。finally:無論程序是否拋出異常,finally代碼塊中的程序一定會(huì)執(zhí)行(try代碼塊里),通常用于釋放資源。
public class Test3 {
public static void test3(String str) {
Integer integer = null;
try {
integer = Integer.valueOf(str);
} catch (Exception e) {
// 打印異常信息
System.out.println(e.getMessage());
}
}
}public class Test {
public static void main(String[] args) throws Exception {
System.out.println(test());
}
public static int test() {
try {
System.out.println("try");
return 10;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("finally...");
return 20;
}
}
}
// 輸出:
// try
// finally...
// 20注意:如果 try 或 catch 中有 return 語句,finally 塊仍然會(huì)在方法返回前執(zhí)行。如果 finally 中也有 return,則會(huì)覆蓋 try 或 catch 中的返回值。
4.throw和throws:主動(dòng)拋出異常
throw 和 throws 是 Java 在處理異常時(shí)使用的關(guān)鍵字,都用來拋出異常,但是使用方式和表示的含義完全不同。
throw:開發(fā)者主動(dòng)創(chuàng)建一個(gè)異常對(duì)象并拋出,用于在代碼邏輯中主動(dòng)發(fā)現(xiàn)并報(bào)告錯(cuò)誤。
public class Test {
public static void main(String[] args) throws Exception {
String str = "Java";
if (str.equals("Java")) {
// 主動(dòng)創(chuàng)建并拋出一個(gè) NumberFormatException
throw new NumberFormatException();
} else {
int num = Integer.parseInt(str);
}
}
}throws:標(biāo)注在方法聲明上,用來描述該方法可能會(huì)拋出的異常。它告訴調(diào)用者,調(diào)用此方法時(shí)需要處理這些可能的異常。
public class Test {
public static void main(String[] args) throws Exception {
try {
test();
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
// 聲明此方法可能會(huì)拋出 NumberFormatException
public static void test() throws NumberFormatException {
String str = "Java";
int num = Integer.parseInt(str);
}
}5. 自定義異常
當(dāng)內(nèi)置的異常類無法滿足業(yè)務(wù)需求時(shí),我們可以創(chuàng)建自定義異常。自定義異常類需要繼承自 Exception 類(或其子類)。
示例:定義一個(gè)方法,對(duì)傳入的參數(shù)進(jìn)行 ++ 操作并返回結(jié)果,同時(shí)要求參數(shù)傳入的必須是整數(shù)類型,如果不是整數(shù)類型則拋出自定義異常。
// 1. 定義自定義異常類,繼承 Exception
public class NumberException extends Exception {
public NumberException(String message) {
super(message);
}
}
// 2. 使用自定義異常
public class Test {
public static void main(String[] args) {
Test test = new Test();
try {
int add = test.add("a"); // 傳入字符串,不是整數(shù)
System.out.println(add);
} catch (NumberException e) {
// 捕獲并處理自定義異常
e.printStackTrace();
}
}
// 方法聲明可能拋出 NumberException
public int add(Object object) throws NumberException {
if (!(object instanceof Integer)) {
// 主動(dòng)拋出自定義異常
throw new NumberException("傳入的參數(shù)不是整數(shù)類型");
} else {
int num = (int) object;
return ++num;
}
}
}總結(jié)
- 包裝類是基本數(shù)據(jù)類型的對(duì)象表示,解決了基本數(shù)據(jù)類型在面向?qū)ο缶幊讨械木窒扌?。裝箱和拆箱是它們之間轉(zhuǎn)換的核心操作。
- 異常處理是 Java 提供的強(qiáng)大機(jī)制,通過
try-catch-finally、throw、throws以及自定義異常,我們可以編寫出更健壯、更易于調(diào)試的代碼。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JDK25模塊導(dǎo)入聲明的實(shí)現(xiàn)步驟
本文主要介紹了JDK25模塊導(dǎo)入聲明的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
解決IDEA集成Docker插件后出現(xiàn)日志亂碼的問題
這篇文章主要介紹了解決IDEA集成Docker插件后出現(xiàn)日志亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì)
這篇文章主要介紹了在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲(控制主飛機(jī)篇)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲,控制主飛機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
深入了解Spring中g(shù)etBean()的五種方式
在本文中,我們將詳細(xì)介紹從BeanFactory中獲取bean的多種方式。簡(jiǎn)單地說,正如方法的名稱所表達(dá)的,getBean()負(fù)責(zé)從Spring?IOC容器中獲取bean實(shí)例,希望對(duì)大家有所幫助2023-02-02
Java線程池的幾種實(shí)現(xiàn)方法及常見問題解答
下面小編就為大家?guī)硪黄狫ava線程池的幾種實(shí)現(xiàn)方法及常見問題解答。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能
這篇文章主要介紹了SpringBoot + thymeleaf 實(shí)現(xiàn)讀取視頻列表并播放視頻功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
Java基礎(chǔ)鞏固小項(xiàng)目點(diǎn)菜系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了一個(gè)Java小項(xiàng)目點(diǎn)菜系統(tǒng)的實(shí)現(xiàn),主要是用的集合,適合正在學(xué)習(xí)Java的朋友拿來實(shí)戰(zhàn)練手,感興趣的朋友快來看看吧2022-03-03
Mybatis插件之自動(dòng)生成不使用默認(rèn)的駝峰式操作
這篇文章主要介紹了Mybatis插件之自動(dòng)生成不使用默認(rèn)的駝峰式操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

