常见异常
-
NullPointerException (空指针异常)
- 原因:尝试访问一个null对象的成员变量或方法。
- 解决方法:确保对象在使用前已被正确初始化。可以使用
Objects.NonNull方法来检查对象是否为null。
String str = null;
System.out.println(str.length()); // 抛出NullPointerException
-
ClassCastException (类转换异常)
- 原因:尝试将一个对象强制转换为不兼容的类型。
- 解决方法:在进行类型转换之前,使用
instanceof关键字检查对象的类型。
Object obj = new Integer(10);
String str = (String) obj; // 抛出ClassCastException
-
IndexOutOfBoundsException (数组下标越界异常)
- 原因:尝试访问数组中不存在的索引。
- 解决方法:确保索引值在数组的有效范围内。
int[] arr = new int[5];
System.out.println(arr[10]); // 抛出ArrayIndexOutOfBoundsException
-
NumberFormatException (数字格式异常)
- 原因:尝试将一个字符串转换为数字时,字符串格式不正确。
- 解决方法:在转换之前,使用正则表达式或其他方法验证字符串的格式。
int num = Integer.parseInt("abc"); // 抛出NumberFormatException
-
FileNotFoundException (文件未找到异常)
- 原因:尝试访问一个不存在的文件。
- 解决方法:在打开文件之前,检查文件是否存在。可以使用
File.exists()方法。
FileReader fileReader = new FileReader("nonexistentfile.txt"); // 抛出FileNotFoundException
-
IOException (输入输出异常)
- 原因:在进行输入输出操作时发生错误。
- 解决方法:捕获并处理具体的IO异常,如
FileNotFoundException、EOFException等。
FileInputStream fis = new FileInputStream("nonexistentfile.txt"); // 抛出IOException
-
OutOfMemoryError (内存溢出错误)
- 原因:程序尝试使用更多的内存空间超过Java虚拟机所分配的最大内存限制。
- 解决方法:优化代码,减少内存使用,或者增加JVM的内存分配。
List<Integer> list = new ArrayList<>();
while (true) {
list.add(new Integer(1)); // 可能抛出OutOfMemoryError
}
-
StackOverflowError(栈溢出错误)
- 原因:当递归调用过深或方法栈使用过多时引发。
- 解决方案:优化递归算法,减少方法栈的使用。
public void recursiveMethod() {
recursiveMethod(); // 可能抛出StackOverflowError
}
-
ClassNotFoundException (类未找到异常)
- 原因:尝试加载不存在的类。
- 解决方法:确保类路径正确,或者在编译时包含所有必要的类文件。
Class.forName("com.example.NonExistentClass"); // 抛出ClassNotFoundException
-
ArithmeticException (算术异常)
- 原因:例如除以零。
- 解决方法:在进行除法操作时,检查除数是否为零。
int a = 10;
int b = 0;
System.out.println(a / b); // 抛出ArithmeticException
-
IllegalArgumentException(非法参数异常)
- 原因:当传递给方法的参数非法或不合适时引发。 - 解决方案:在调用方法之前,检查参数的有效性。
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}
setAge(-5); // 抛出IllegalArgumentException
- IllegalStateException(非法状态异常)
- 原因:通常发生在对象的状态不合法或不适当的情况下,导致无法执行某个操作。
- 解决方法:确保对象处于合法状态后再进行操作。
List list = new ArrayList();
list.add("element");
list.clear();
list.get(0); // 抛出IllegalStateException
异常处理的最佳实践
- 使用try-catch块捕获异常:在可能抛出异常的代码块周围使用try-catch块来捕获并处理异常。
- 抛出异常:当方法无法处理异常时,可以使用
throw关键字抛出异常。 - 声明异常:使用
throws关键字声明方法可能抛出的异常,让调用者处理。 - 自定义异常:根据业务需求创建自定义异常类,以便更好地管理和处理特定类型的异常。