[Java]新手必看10个常见错误及解决方法
### 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
public void addObject(Object obj) {
list.add(obj); // 静态集合持有引用,导致对象无法回收
}
}
// 正确做法
public class ProperMemory {
private List
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);
}
```
更多推荐


所有评论(0)