在开发过程中难免会遇到bug,理解bug的含义,定位bug的位置,对于解决bug至关重要!掌握高效的排错技巧,对于程序员来说必不可少。
目录
1、空指针异常(java.lang.NullpointerException)
2、数组下标越界异常(java.lang.IndexOutOfBoundsException)
3、访问权限(java.lang.IllegalAccessException)
4、OOM内存不足(java.lang.OutOfMemoryException)
一、错误异常的分类
Throwable类的两个子类:
(1)Exception:出现的问题是可以被捕获的
(2)Error:系统错误, Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态,通常由JVM进行处理,与我们执行的操作无关
二、常见报错信息及原因(持续更新中)
1、空指针异常(java.lang.NullpointerException)
原因:当应用程序试图在需要对象的地方使用null时,抛出该异常。经常出现在创建对象,调用数组这些代码中。包括:调用 null 对象的实例方法。
访问或修改 null 对象的字段。
将 null 作为一个数组,获得其长度。
将 null 作为一个数组,访问或修改其时间片。
将 null 作为 Throwable 值抛出。
2、数组下标越界异常(java.lang.IndexOutOfBoundsException)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at ArrayTest.main(ArrayTest.java:4)
报错信息中可以明显看到“ArrayIndexOutOfBoundsException”。我们需要查看程序中调用的数组或者字符串的下标值是不是超出了数组的范围
3、访问权限(java.lang.IllegalAccessException)
当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这异常。
一种情况是使用了package,方法不在同一个包下。
另一种情况是,方法的访问修饰符为private。
4、OOM内存不足(java.lang.OutOfMemoryException)
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误
原因
1、系统里缓存了大量的数据,没有及时释放。应该控制缓存的数据大小,缓存失效的时间
2、本地资源泄漏
三、排错的思路
拿一个例子举例说明
环境: SpringCloud 框架,使用nacos服务注册中心,配置了德鲁伊数据池管理。
2023-01-30 11:10:05.204 ERROR [prosper-order,,,] 27512 --- [ main] com.alibaba.druid.pool.DruidDataSource : init datasource error, url: jdbc:mysql://jyz.coolpanda.tech:3306/prosper_dev?autoReconnect=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.16.jar:8.0.16] at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:905) ~[mysql-connector-java-8.0.16.jar:8.0.16]
1、查看报错信息
报错信息很宝贵,也很明确
A. 上面的例子中,可以看出**ERROR**后面有绿色提示 "com.alibaba.druid.pool.DruidDataSource"
明显看出是DruidDataSource的问题。
B.再往后看具体的报错信息"init datasource error"
2、定位报错位置
定位到具体报错信息,说不能创建数据库连接,超时,放弃。
那我们思考,哪里进行了数据库连接配置,配置是否正确,再去排查。