java常见异常及解决方法
1.ArithmeticException算术异常
是因为在 Java 中尝试执行除以零的操作导致的,Java 不允许整数类型的变量进行除以零的操作,因为数学上这是没有定义的。当程序试图执行这样的操作时,JVM 将抛出一个 ArithmeticException 异常。
解决方法:
1.通过if条件检查除数
if (divisor != 0) {
int result = dividend / divisor;
} else {
System.out.println("Error: Division by zero is not allowed.");
}
2.使用 try-catch 块捕获异常
try {
int result = dividend / divisor;
} catch (ArithmeticException e) {
System.out.println("Error: An arithmetic exception occurred - " + e.getMessage());
}
2.ArrayIndexOutOfBoundsException数组下标越界异常
是因为在 Java 中尝试访问数组时,索引超出了数组的有效范围。
解决方法:
if (index >= 0 && index < array.length) {
int value = array[index];
System.out.println("Value at index " + index + ": " + value);
}
3.NullPointerException空指针异常
是因为在 Java 中尝试调用一个 null 对象的方法导致的。具体来说,尝试在一个尚未初始化的对象上调用方法,这会导致 NullPointerException。所以要增强代码的健壮性
解决方法:
if(StringUtils.isBlank(dto.getName()) || StringUtils.isBlank(dto.getPassword())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"用户名或密码为空");
}
4.ClassCastException类型转换异常
我这里是因为在 Java 中尝试将一个 Object 类型的对象强制转换为 String 类型,但该对象实际上并不是 String 类型的。这种类型转换错误会导致 ClassCastException。这种异常非常常见通常发生在类型转换,前后端数据传输时
解决方法:
具体要看什么类型的数据,根据数据类型去解决这里不再过多赘述
5.StackOverflowError栈内存溢出错误
是因为在 Java 中发生了栈溢出错误。这种错误通常是由无限递归引起的,即一个方法不断地调用自身,直到栈空间耗尽。
解决方法:
添加终止条件
public class TestError {
public static void m(int n) {
if (n <= 0) {
return; // 终止条件
}
System.out.println("n = " + n);
m(n - 1); // 递归调用
}
public static void main(String[] args) {
m(5); // 调用递归方法
}
}
6.InputMismatchException输入不匹配
解决方法:
使用异常处理机制
import java.util.Scanner;
import java.util.InputMismatchException;
public class TestException {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number = 0;
while (true) {
try {
System.out.println("请输入一个整数:");
number = scanner.nextInt();
break; // 如果输入正确,跳出循环
} catch (InputMismatchException e) {
System.out.println("输入错误,请输入一个整数!");
scanner.next(); // 清除错误的输入
}
}
System.out.println("你输入的整数是:" + number);
}
}
7.401权限不足报错
该类异常通常发生在接口测试调用时,没有足够的权限进行访问
解决方法:
设置全局参数密钥
8.文件未找到异常
当使用 FileInputStream 或其他文件输入类尝试读取一个不存在的文件时,会抛出这个异常。
解决方法:
查看文件存在与否
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileNotFoundExceptionExample {
public static void main(String[] args) {
File file = new File("nonexistentfile.txt");
if (!file.exists()) {
System.out.println("文件不存在,请检查文件路径是否正确。");
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
// 读取文件内容的代码
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
9.类未找到异常ClassNotFoundException
主要是因为尝试加载一个不存在的类报错发生
解决方法:
检查类的存在与否。
10.并发修改异常
当在进行迭代操作时,试图并发修改集合(如ArrayList)的结构时,会抛出ConcurrentModificationException异常
解决方法:
1.避免在迭代时修改集合的结构。可以使用Iterator进行迭代,并使用Iterator的remove()方法删除元素,或者创建一个临时副本进行修改操作。
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();
}
}
2.避免在迭代时修改集合的结构。可以使用Iterator进行迭代,并使用Iterator的remove()方法删除元素,或者创建一个临时副本进行修改操作。
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();
}
}
11.时间格式化异常DateTimeParseException
当尝试将字符串解析为日期或时间时,如果字符串格式与指定的格式不匹配,会抛出DateTimeParseException异常
解决方法:
确保提供的字符串符合指定的日期或时间格式。可以使用DateTimeFormatter指定解析格式,并使用try-catch块来捕获并处理解析异常。
String dateStr = "2023-07-20";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
try {
LocalDate date = LocalDate.parse(dateStr, formatter);
// 进一步处理
} catch (DateTimeParseException e) {
e.printStackTrace();
}
12.数据库访问异常 SQLException
Exception in thread "main" java.sql.SQLException: Connection refused: connect
at java.sql.DriverManager.getConnection(DriverManager.java:645)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at com.itheima.d1.DatabaseAccessExample.main(DatabaseAccessExample.java:15)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at java.sql.DriverManager.getConnection(DriverManager.java:622)
... 2 more
解决方法:
检查你的sql语句和yaml数据库配置