### 1. 空指针异常(NullPointerException)

错误原因:尝试调用一个空对象的方法或访问其属性。

解决方法:

- 使用前检查对象是否为null

- 使用Optional类进行安全处理

- 使用三目运算符提供默认值

```java

// 错误示例

String str = null;

System.out.println(str.length());

// 正确做法

if (str != null) {

System.out.println(str.length());

}

// 或使用Optional

Optional.ofNullable(str).ifPresent(s -> System.out.println(s.length()));

```

### 2. 数组越界异常(ArrayIndexOutOfBoundsException)

错误原因:访问了不存在的数组索引。

解决方法:

- 确保索引在有效范围内

- 使用增强for循环

```java

// 错误示例

int[] arr = {1, 2, 3};

System.out.println(arr[5]);

// 正确做法

if (index >= 0 && index < arr.length) {

System.out.println(arr[index]);

}

// 或使用增强for循环

for (int num : arr) {

System.out.println(num);

}

```

### 3. 类型转换异常(ClassCastException)

错误原因:不安全的类型强制转换。

解决方法:

- 使用instanceof进行类型检查

- 使用泛型

```java

// 错误示例

Object obj = Hello;

Integer num = (Integer) obj;

// 正确做法

if (obj instanceof Integer) {

Integer num = (Integer) obj;

}

```

### 4. 并发修改异常(ConcurrentModificationException)

错误原因:在遍历集合时修改集合内容。

解决方法:

- 使用迭代器的remove方法

- 使用并发集合类

- 创建集合的副本进行遍历

```java

// 错误示例

List list = new ArrayList<>();

list.add(a);

for (String s : list) {

if (a.equals(s)) {

list.remove(s); // 抛出异常

}

}

// 正确做法

Iterator iterator = list.iterator();

while (iterator.hasNext()) {

String s = iterator.next();

if (a.equals(s)) {

iterator.remove(); // 安全删除

}

}

```

### 5. 数字格式异常(NumberFormatException)

错误原因:将非数字字符串转换为数字类型。

解决方法:

- 使用try-catch处理异常

- 使用正则表达式验证

```java

// 错误示例

String str = abc;

int num = Integer.parseInt(str);

// 正确做法

try {

int num = Integer.parseInt(str);

} catch (NumberFormatException e) {

System.out.println(字符串不是有效数字);

}

// 或使用正则验证

if (str.matches(-?\d+)) {

int num = Integer.parseInt(str);

}

```

### 6. 内存泄漏

错误原因:对象不再使用但仍被引用,无法被垃圾回收。

解决方法:

- 及时释放资源

- 使用弱引用

- 避免静态集合长期持有对象引用

```java

// 错误示例

public class MemoryLeak {

private static List list = new ArrayList<>();

public void addObject(Object obj) {

list.add(obj); // 静态集合持有引用,导致对象无法回收

}

}

// 正确做法

public class ProperMemory {

private List list = new ArrayList<>(); // 非静态

public void clearList() {

list.clear(); // 及时清理

}

}

```

### 7. 资源未关闭

错误原因:使用IO流、数据库连接等资源后未关闭。

解决方法:

- 使用try-with-resources

- 在finally块中关闭资源

```java

// 错误示例

FileInputStream fis = new FileInputStream(file.txt);

// 使用后忘记关闭

// 正确做法

try (FileInputStream fis = new FileInputStream(file.txt);

BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {

// 使用资源

} catch (IOException e) {

e.printStackTrace();

}

```

### 8. equals和hashCode方法不一致

错误原因:重写equals方法但未重写hashCode方法。

解决方法:

- 同时重写equals和hashCode方法

- 使用IDE自动生成

```java

// 错误示例

class Person {

String name;

@Override

public boolean equals(Object obj) {

// 只重写了equals

}

}

// 正确做法

class Person {

String name;

@Override

public boolean equals(Object obj) {

if (this == obj) return true;

if (obj == null || getClass() != obj.getClass()) return false;

Person person = (Person) obj;

return Objects.equals(name, person.name);

}

@Override

public int hashCode() {

return Objects.hash(name);

}

}

```

### 9. 字符串拼接性能问题

错误原因:在循环中使用+进行字符串拼接。

解决方法:

- 使用StringBuilder或StringBuffer

```java

// 错误示例

String result = ;

for (int i = 0; i < 1000; i++) {

result += i; // 每次循环创建新String对象

}

// 正确做法

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 1000; i++) {

sb.append(i);

}

String result = sb.toString();

```

### 10. 忽略异常处理

错误原因:捕获异常后不做任何处理。

解决方法:

- 合理记录异常信息

- 根据业务需求进行适当处理

```java

// 错误示例

try {

// 可能抛出异常的代码

} catch (Exception e) {

// 空catch块,异常被忽略

}

// 正确做法

try {

// 可能抛出异常的代码

} catch (SpecificException e) {

logger.error(具体异常信息, e);

// 根据业务需求进行恢复或抛出

} catch (Exception e) {

logger.error(未知异常, e);

throw new RuntimeException(e);

}

```

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐