目錄:
1、空指針異常
2、類(lèi)型轉(zhuǎn)換異常
3、數(shù)組越界異常
4、除零異常
5、輸入輸出異常
6、類(lèi)未找到異常
7、并發(fā)修改異常
8、棧溢出錯(cuò)誤
9、類(lèi)型不匹配異常
10、時(shí)間格式化異常
11、數(shù)字格式化異常
12、方法重載沖突
1、空指針異常(NullPointerException)
描述:當(dāng)試圖訪問(wèn)一個(gè)空引用對(duì)象的屬性或調(diào)用空引用對(duì)象的方法時(shí),會(huì)拋出NullPointer異常。
例:
String str = null;
System.out.println(str.length());
解決方案:在使用對(duì)象之前,確保對(duì)象不為null??梢酝ㄟ^(guò)添加null檢查或使用條件語(yǔ)句來(lái)避免該錯(cuò)誤。
2、類(lèi)型轉(zhuǎn)換異常(ClassCastException)
描述:當(dāng)試圖將一個(gè)對(duì)象強(qiáng)制轉(zhuǎn)換為與其實(shí)際類(lèi)型不兼容的類(lèi)型時(shí),會(huì)拋出ClassCastException異常。
例:
Object obj = "Java";
Integer num = (Integer) obj;
解決方案:在進(jìn)行類(lèi)型轉(zhuǎn)換前,先使用instanceof運(yùn)算符進(jìn)行類(lèi)型檢查,確保對(duì)象可以成功轉(zhuǎn)換?;蛘呤褂煤线m的類(lèi)型轉(zhuǎn)換操作來(lái)避免該錯(cuò)誤。
if (obj instanceof Integer) {
Integer num = (Integer) obj;
// 進(jìn)一步處理
}
3、數(shù)組越界異常(ArrayIndexOutOfBoundsException)
描述:當(dāng)試圖訪問(wèn)數(shù)組中超出有效索引范圍的位置時(shí),會(huì)拋出ArrayIndexOutOfBoundsException異常。
例:
int[] arr = {1, 2, 3};
int element = arr[3];
解決方案:確保訪問(wèn)數(shù)組時(shí),索引值在有效范圍內(nèi)。要注意Java數(shù)組的索引從0開(kāi)始,因此最大索引是數(shù)組長(zhǎng)度減1。
if (index >= 0 && index < arr.length) {
int element = arr[index];
// 進(jìn)一步處理
}
4、除零異常(ArithmeticException)
描述:當(dāng)進(jìn)行整數(shù)除法或取模運(yùn)算時(shí),除數(shù)為零會(huì)拋出ArithmeticException異常。
例:
int a = 5;
int b = 0;
int result = a / b;
解決方案:在進(jìn)行除法或取模運(yùn)算時(shí),要確保除數(shù)不為零,可以使用條件語(yǔ)句預(yù)先檢查除數(shù)是否為零。
if (b != 0) {
int result = a / b;
// 進(jìn)一步處理
}
5、輸入輸出異常(IOException)
描述:在處理輸入輸出操作時(shí),如果出現(xiàn)讀取或?qū)懭胧?、文件不存在或無(wú)法訪問(wèn)等情況,會(huì)拋出IOException異常。
例:
FileReader reader = new FileReader("path/to/nonexistent-file.txt");
int data = reader.read();
解決方案:在進(jìn)行輸入輸出操作時(shí),要確保文件存在、路徑正確、權(quán)限足夠,并且進(jìn)行異常處理,例如使用try-catch塊捕獲和處理IOException異常。
try {
FileReader reader = new FileReader("path/to/existing-file.txt");
int data = reader.read();
// 進(jìn)一步處理
} catch (IOException e) {
e.printStackTrace();
}
6、類(lèi)未找到異常(ClassNotFoundException)
描述:當(dāng)試圖加載某個(gè)類(lèi),但找不到該類(lèi)時(shí),會(huì)拋出ClassNotFoundException異常。
例:
try {
Class.forName("com.example.NonExistentClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
解決方案:確保引用的類(lèi)存在于正確的位置,并且類(lèi)路徑設(shè)置正確。如果使用外部庫(kù)或框架,確保將相關(guān)的jar文件添加到類(lèi)路徑中。
7、并發(fā)修改異常(ConcurrentModificationException)
描述:當(dāng)在進(jìn)行迭代操作時(shí),試圖并發(fā)修改集合(如ArrayList)的結(jié)構(gòu)時(shí),會(huì)拋ConcurrentModificationException異常。
例:
List<String> list = new ArrayList<>();
list.add("Java");
for (String item : list) {
if (item.equals("Java")) {
list.remove(item);
}
}
解決方案:避免在迭代時(shí)修改集合的結(jié)構(gòu)??梢允褂肐terator進(jìn)行迭代,并使用Iterator的remove()方法刪除元素,或者創(chuàng)建一個(gè)臨時(shí)副本進(jìn)行修改操作。
List<String> list = new ArrayList<>();
list.add("Java");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("Java")) {
iterator.remove();
}
}
8、棧溢出錯(cuò)誤(StackOverflowError)
描述:當(dāng)方法調(diào)用的嵌套層級(jí)過(guò)深,導(dǎo)致棧空間耗盡時(shí),會(huì)拋出StackOverflowError錯(cuò)誤。
例:
public static void recursiveMethod() {
recursiveMethod();
}
public static void main(String[] args) {
recursiveMethod();
}
解決方案:確保遞歸方法具有退出條件,避免無(wú)限遞歸調(diào)用。每次遞歸調(diào)用時(shí),問(wèn)題規(guī)模應(yīng)該減小,直到達(dá)到退出條件。
public static void recursiveMethod(int n) {
if (n <= 0) {
return;
}
// 進(jìn)行遞歸操作
recursiveMethod(n - 1);
}
9、類(lèi)型不匹配異常(MismatchedInputException)
描述:在使用JSON庫(kù)(如Jackson)反序列化時(shí),如果JSON數(shù)據(jù)與目標(biāo)類(lèi)型不匹配,會(huì)拋出MismatchedInputException異常。
例:
ObjectMapper mapper = new ObjectMapper();
String json = "{\"username\": \"Alice\", \"age\": 25}";
MyPojo pojo = mapper.readValue(json, MyPojo.class);
解決方案:確保JSON數(shù)據(jù)與目標(biāo)類(lèi)型匹配,包括字段名稱(chēng)和數(shù)據(jù)類(lèi)型。可以使用@JsonProperty注解或自定義反序列化器來(lái)處理不匹配的字段。
public class MyPojo {
@JsonProperty("username")
private String username;
// 其他字段和getter/setter
}
10、時(shí)間格式化異常(DateTimeParseException)
描述:當(dāng)嘗試將字符串解析為日期或時(shí)間時(shí),如果字符串格式與指定的格式不匹配,會(huì)拋出DateTimeParseException異常。
例:
String dateStr = "2024-03-14";
LocalDate date = LocalDate.parse(dateStr);
解決方案:確保提供的字符串符合指定的日期或時(shí)間格式??梢允褂肈ateTimeFormatter指定解析格式,并使用try-catch塊來(lái)捕獲并處理解析異常。
String dateStr = "2024-03-14";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
try {
LocalDate date = LocalDate.parse(dateStr, formatter);
// 進(jìn)一步處理
} catch (DateTimeParseException e) {
e.printStackTrace();
}
11、數(shù)字格式化異常(NumberFormatException)
描述:當(dāng)嘗試將一個(gè)無(wú)法轉(zhuǎn)換為數(shù)字的字符串轉(zhuǎn)換為數(shù)字類(lèi)型時(shí),會(huì)拋出NumberFormatException異常。
例:
String numberStr = "ABC123";
int number = Integer.parseInt(numberStr);
解決方案:在進(jìn)行字符串轉(zhuǎn)換為數(shù)字的操作之前,確保字符串僅包含有效的數(shù)字字符??梢允褂谜齽t表達(dá)式或合適的校驗(yàn)方法來(lái)驗(yàn)證字符串是否為有效的數(shù)字。
String numberStr = "123";
if (numberStr.matches("\\d+")) {
int number = Integer.parseInt(numberStr);
// 進(jìn)一步處理
}
12、方法重載沖突(AmbiguousMethodCallException)
描述:當(dāng)調(diào)用一個(gè)方法時(shí),傳遞的參數(shù)類(lèi)型不明確,無(wú)法確定要調(diào)用哪個(gè)重載方法時(shí),會(huì)拋出AmbiguousMethodCallException異常。
例:
public static void printData(int data) {
System.out.println("int: " + data);
}
public static void printData(double data) {
System.out.println("double: " + data);
}
public static void main(String[] args) {
printData(10);
}
解決方案:在調(diào)用方法時(shí),提供明確的參數(shù)類(lèi)型,以消除重載方法的歧義。可以通過(guò)類(lèi)型轉(zhuǎn)換或者使用合適的參數(shù)類(lèi)型來(lái)解決沖突。
public static void main(String[] args) {
printData((double) 10);
// 或者
printData(10.0);
}