1. java.lang.OutOfMemoryError
错误描述:当Java虚拟机(JVM)无法分配更多内存时抛出,表现为应用程序突然崩溃或响应变慢,日志中通常包含“OutOfMemoryError”关键字及内存区域信息(如堆、元空间)。
可能原因:① JVM堆内存设置过小(如-Xmx
参数值低于应用实际需求);② 应用程序存在内存泄漏(如静态集合持有对象引用未释放、数据库连接未关闭);③ 大对象分配超出内存容量(如一次性加载超大文件到内存)。
解决方法:① 调整JVM内存参数,增加堆内存大小(如-Xmx2g -Xms2g
,根据服务器资源调整);② 使用内存分析工具(如VisualVM、MAT)检测内存泄漏点,修复代码中未释放的资源;③ 优化代码逻辑,避免一次性加载大量数据,改用分批处理。
2. java.lang.NullPointerException
错误描述:试图访问或操作未初始化的对象(null引用),日志中显示“NullPointerException”及具体报错行号(如Exception in thread "main" java.lang.NullPointerException at com.example.Main.main(Main.java:10)
)。
可能原因:① 对象未正确初始化(如未调用构造函数、依赖注入失败);② 错误的空指针解引用(如obj.method()
中obj
为null);③ 外部数据未校验(如数据库查询结果为空,直接访问字段)。
解决方法:① 使用前检查对象是否为null(如if (obj != null) { obj.method(); }
);② 确保对象在使用前已完成初始化(如通过构造函数、@Autowired
注解正确注入);③ 对外部数据(如请求参数、数据库查询结果)进行空值校验,避免直接操作。
3. java.lang.ArrayIndexOutOfBoundsException
错误描述:尝试访问数组中不存在的索引,日志中显示“ArrayIndexOutOfBoundsException”及违规索引和数组长度(如Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3 at com.example.Main.main(Main.java:8)
)。
可能原因:① 数组访问越界(如循环条件错误,索引超过array.length-1
);② 错误的索引计算(如负数索引、未校验的输入作为索引);③ 数组长度动态变化但索引未同步更新。
解决方法:① 检查数组访问逻辑,确保索引在0
到array.length-1
范围内;② 对用户输入或外部数据进行合法性校验(如if (index >= 0 && index < array.length) { ... }
);③ 使用集合类(如ArrayList
)替代数组,避免手动管理索引。
4. java.net.UnknownHostException
错误描述:无法解析主机名,日志中显示“UnknownHostException”及无法解析的主机名(如Exception in thread "main" java.net.UnknownHostException: Unable to resolve host "example.com": example.com
)。
可能原因:① /etc/hosts
文件中主机名与IP映射错误(如主机名拼写错误、IP地址无效);② DNS服务器配置问题(如DNS服务器不可达、域名未解析);③ 网络连接故障(如防火墙阻止DNS查询)。
解决方法:① 检查/etc/hosts
文件,确保主机名与IP地址映射正确(如127.0.0.1 localhost
);② 检查DNS设置(如/etc/resolv.conf
中的DNS服务器地址),测试DNS解析(如nslookup example.com
);③ 排查网络连接,确保防火墙允许DNS查询(UDP 53端口)。
5. java.io.FileNotFoundException
错误描述:试图打开不存在的文件或目录,日志中显示“FileNotFoundException”及文件路径(如Exception in thread "main" java.io.FileNotFoundException: /data/app/config.properties (No such file or directory)
)。
可能原因:① 文件路径错误(如相对路径未基于正确的工作目录、路径拼写错误);② 文件被移动、删除或重命名;③ 文件权限不足(如应用程序无读取权限)。
解决方法:① 确认文件路径正确,使用绝对路径或检查工作目录(通过pwd
命令);② 检查文件是否存在(如ls -l /data/app/config.properties
);③ 修改文件权限(如chmod 644 /data/app/config.properties
)或所有者(如chown appuser:appgroup /data/app/config.properties
)。
6. ClassNotFoundException
错误描述:应用程序尝试加载不存在的类,日志中显示“ClassNotFoundException”及缺失的类名(如Exception in thread "main" java.lang.ClassNotFoundException: com.example.MissingClass
)。
可能原因:① 类路径(Classpath)中缺少对应的JAR包(如依赖未正确引入);② JAR包版本冲突(如不同版本的同一类库导致类加载失败);③ 类名拼写错误(如配置文件中的类名与实际类名不一致)。
解决方法:① 检查项目的依赖管理(如Maven的pom.xml
、Gradle的build.gradle
),确保缺失的类所在的JAR包已正确引入;② 使用mvn dependency:tree
(Maven)或gradle dependencies
(Gradle)检查依赖冲突,排除重复或冲突的依赖;③ 核对配置文件(如log4j.properties
、Spring的applicationContext.xml
)中的类名拼写,确保与实际类名一致。
7. SQLException(数据库操作错误)
错误描述:数据库操作失败,日志中显示“SQLException”及具体错误信息(如java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
或Communications link failure
)。
可能原因:① 数据库连接信息错误(如用户名、密码错误、URL格式不正确);② 数据库服务未启动(如MySQL未运行);③ SQL语法错误(如表名、字段名拼写错误、缺少关键字);④ 数据库权限不足(如用户无表访问权限)。
解决方法:① 检查数据库连接配置(如jdbc:mysql://localhost:3306/dbname?user=root&password=123456
),确保URL、用户名、密码正确;② 启动数据库服务(如systemctl start mysqld
)或检查数据库状态(如systemctl status mysqld
);③ 校验SQL语法(如在数据库客户端中执行SQL语句),修复拼写错误;④ 授权数据库用户权限(如GRANT ALL PRIVILEGES ON dbname.* TO 'root'@'localhost';
)。
8. 日志框架配置错误(如Log4j、Logback)
错误描述:日志无法输出到指定文件、日志级别无效或日志格式混乱,日志中显示“Logger initialization failed”“No appenders could be found for logger”等。
可能原因:① 日志框架配置文件(如log4j.properties
、logback.xml
)路径错误(未放在类路径下);② 配置文件语法错误(如XML标签未闭合、属性值格式错误);③ 多个日志框架冲突(如项目中同时引入Log4j和Logback);④ 日志级别设置过高(如<root level="ERROR">
导致INFO日志不输出)。
解决方法:① 确认配置文件位于类路径下(如src/main/resources
目录),检查文件名是否正确;② 校验配置文件语法(如使用XML验证工具检查logback.xml
),修复标签或属性错误;③ 排除冲突的日志框架依赖(如Maven中排除log4j-over-slf4j
等桥接包);④ 调整日志级别(如<root level="INFO">
),确保符合需求。