bug记录

83 阅读4分钟

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.propertiesapplication.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 告知消息。

原因

  1. 客户端提前关闭连接:客户端在没有接收到服务器的 close_notify 消息之前就关闭了连接。TLS 规范规定,一方在关闭连接前应该发送一个 close_notify 告知另一方。
  2. 网络问题:网络延迟或丢包可能导致客户端在接收到 close_notify 消息之前就已经关闭了连接。
  3. 配置问题:服务器或客户端的 SSL/TLS 配置不当,可能导致关闭握手过程出现问题。
  4. 超时设置:客户端在等待 close_notify 消息时设置了过短的超时时间,导致提前关闭连接。