Java中的异常机制是一种处理程序在运行时可能发生的不可预测情况的方式。异常是指在程序执行期间遇到的错误或其他意外事件,它会中断程序的正常执行流程。
Java中的异常分为两类:Checked Exception(已检查异常)和Unchecked Exception(未检查异常)。其中Checked Exception需要在编译时捕获并处理,否则代码无法通过编译;而Unchecked Exception则不要求必须在编译时进行处理,可以选择捕获或者将其抛出。
Java中常见的异常有以下几种:
- NullPointerException(空指针异常):当应用程序试图访问null对象时抛出。
解决思路:避免使用null引用,或者在使用之前进行非空校验。
代码示例:
String str = null;
// 不进行非空校验,会抛出NullPointerException
int length = str.length();
// 进行非空校验
if (str != null) {int length = str.length();
}
- ArrayIndexOutOfBoundsException(数组越界异常):当应用程序试图访问数组中不存在的元素或者访问超出数组范围的元素时抛出。
解决思路:检查数组下标是否越界,或者动态调整数组的长度。
代码示例:
int[] arr = {1, 2, 3};
// 当访问的下标大于等于数组长度时,会抛出ArrayIndexOutOfBoundsException
int value = arr[3];
- ClassCastException(类转换异常):当试图将一个对象强制转换为它所不属于的类时抛出。
解决思路:避免使用错误类型的对象进行类型转换,或者在转换之前进行类型判断。
代码示例:
Object obj = "hello";
// 非法的类型转换,会抛出ClassCastException
Integer num = (Integer) obj;
// 判断对象是否是正确的类型
if (obj instanceof String) {String str = (String) obj;
}
- IllegalArgumentException(非法参数异常):当传入的参数不符合方法规范时抛出。
解决思路:检查参数是否符合方法规范,并给出明确的错误提示。
代码示例:
public void doSomething(String param) {// 参数为空,抛出IllegalArgumentExceptionif (param == null || param.length() == 0) {throw new IllegalArgumentException("Invalid parameter: " + param);}// ...
}
- ArithmeticException(算术异常):当试图除以零或取模时抛出。
解决思路:避免除数为零或者取模的模数为零,或者对于可能存在此类异常的情况进行特殊处理。
代码示例:
int a = 10;
int b = 0;
// 当除数为零时,会抛出ArithmeticException
int c = a / b;int d = 10;
int e = 0;
// 对于除数为零的情况进行特殊处理
int f = (e == 0) ? 0 : d / e;
在处理异常时,我们需要根据具体的业务场景和需求来选择适当的处理方式。常见的处理方式包括打印异常信息、记录异常日志、返回错误信息或重新尝试执行等。以下是一个示例代码块:
try {// 可能会抛出某些异常的代码
} catch (Exception e) {// 打印异常信息e.printStackTrace();// 记录异常日志logger.error("Some error happened", e);// 返回错误信息return ResponseEntity.badRequest().body("Some error happened");// 重新尝试执行// ...
}