1. NullPointerException
原因:尝试访问一个尚未初始化的对象的成员。
解决方法:
- 确保对象在使用前已被正确初始化。
- 在使用对象前,使用
null检查来确保对象不为null。 - 使用 Java 8 及以后版本的
Optional类来处理可能为null的值。
2. ClassCastException
原因:尝试将对象强制转换为不兼容的类型。
解决方法:
- 在进行类型转换前,使用
instanceof关键字进行类型检查。 - 确保转换的类型是正确的,并且对象确实是该类型的实例。
3. IndexOutOfBoundsException
原因:访问数组或集合时索引超出范围。
解决方法:
- 在访问数组或集合前,检查索引是否合法。
- 使用集合的方法如
isEmpty()或者size()来判断集合的状态。
4. ArithmeticException
原因:执行算术运算时发生异常,比如说除以零。
解决方法:
- 在进行除法运算前,检查除数是否为零。
- 使用异常处理来捕获这类异常,并给出合理的提示或处理逻辑。
5. OutOfMemoryError
原因:JVM 内存不足,无法分配更多空间。
解决方法:
- 增加 JVM 的堆内存大小,使用
-Xms和-Xmx参数。 - 优化代码,减少不必要的对象创建和内存使用。
- 使用垃圾回收日志来分析内存使用情况,并进行针对性的优化。
6. ClassNotFoundException
原因:类加载器无法找到指定的类。
解决方法:
- 确保所需的类已经添加到了类路径中。
- 检查依赖关系是否正确安装,并且版本号匹配。
- 使用 Maven 或 Gradle 等构建工具来管理依赖。
7. NoSuchMethodError
原因:尝试调用不存在的方法。
解决方法:
- 确认方法签名是否正确,并且存在于类中。
- 检查编译和运行时使用的类文件版本是否一致。
- 更新相关依赖库或重新编译项目。
8. FileNotFoundException
原因:尝试打开一个不存在的文件。
解决方法:
- 检查文件路径是否正确,并且文件确实存在。
- 确认应用程序有足够的权限去访问文件。
- 使用异常处理来捕获此类异常,并给出提示或备选方案。
9. SQLException
原因:在使用 JDBC 时发生 SQL 错误。
解决方法:
- 检查 SQL 语句是否正确,并且符合数据库语法。
- 确认数据库连接是否正常,并且驱动程序已正确安装。
- 使用异常处理来捕获异常,并提供详细的错误信息。
10. ConcurrentModificationException
原因:在迭代集合时修改了集合。
解决方法:
- 在迭代集合时不要直接修改集合,可以使用
Iterator.remove()方法来删除元素。 - 使用
Collections.synchronizedCollection包装集合,或者使用线程安全的集合类如CopyOnWriteArrayList。 - 使用
foreach循环代替传统的for循环,以减少出错的机会。
SpringBoot
DataAccessException
原因:数据库操作时发生异常。
解决方法:
- 检查数据库连接是否正常。
- 确认 SQL 语句是否正确,以及表结构是否匹配。
- 使用事务管理(
@Transactional)来确保数据的一致性。
端口冲突
当启动Spring Boot应用时,可能会遇到端口冲突的问题。默认情况下,Spring Boot使用8080端口。如果已经有其他服务占用了这个端口,就会导致启动失败。
解决方法
- 更改Spring Boot的端口号。在
application.properties或application.yml文件中设置server.port属性。
# closing inbound before receiving peer‘s close_notify
** BEGIN NESTED EXCEPTION **
javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify
STACKTRACE:
javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:744)
at sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:723)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:2249)
at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4221)
at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1464)
at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:143)
at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection$1(HikariPool.java:451)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)
** END NESTED EXCEPTION **
closing inbound before receiving peer's close_notify 是一个与 SSL/TLS 连接关闭相关的错误信息。这个错误通常发生在使用 HTTPS 的应用程序中,特别是在客户端尝试关闭连接时,服务器还没有发送 close_notify 告知消息。
原因
- 客户端提前关闭连接:客户端在没有接收到服务器的
close_notify消息之前就关闭了连接。TLS 规范规定,一方在关闭连接前应该发送一个close_notify告知另一方。 - 网络问题:网络延迟或丢包可能导致客户端在接收到
close_notify消息之前就已经关闭了连接。 - 配置问题:服务器或客户端的 SSL/TLS 配置不当,可能导致关闭握手过程出现问题。
- 超时设置:客户端在等待
close_notify消息时设置了过短的超时时间,导致提前关闭连接。