JAVA-定位排查bug

在开发过程中难免会遇到bug,理解bug的含义,定位bug的位置,对于解决bug至关重要!掌握高效的排错技巧,对于程序员来说必不可少。

目录

一、错误异常的分类

二、常见报错信息及原因(持续更新中)

1、空指针异常(java.lang.NullpointerException)

2、数组下标越界异常(java.lang.IndexOutOfBoundsException)

3、访问权限(java.lang.IllegalAccessException)

4、OOM内存不足(java.lang.OutOfMemoryException)

三、排错的思路

1、查看报错信息

2、定位报错位置

一、错误异常的分类


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、定位报错位置


定位到具体报错信息,说不能创建数据库连接,超时,放弃。
那我们思考,哪里进行了数据库连接配置,配置是否正确,再去排查。

四、辅助的工具

1. 使用日志打印

日志是定位和排查 Bug 的重要工具之一。通过在关键代码中添加日志输出语句,可以帮助开发人员追踪代码执行流程和变量值。以下是使用日志打印的示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

    public void myMethod() {
        logger.debug("Entering myMethod");

        // 代码逻辑

        logger.debug("Exiting myMethod");
    }
}

在上面的示例中,我们使用 SLF4J 和日志框架打印了进入和退出方法的日志信息。通过查看日志输出,可以追踪代码的执行情况。

2. 使用断言

断言是用于验证代码逻辑的工具,可以在关键位置插入断言语句来检查预期的条件是否满足。如果条件不满足,断言会抛出 AssertionError 异常。以下是使用断言的示例:

public class MyClass {
    public void myMethod(int value) {
        assert value > 0 : "Value must be positive";

        // 代码逻辑
    }
}

在上面的示例中,我们使用断言来确保传入的 value 参数大于 0。如果条件不满足,将抛出 AssertionError 异常,帮助我们定位问题。

3. 异常处理和调试

在 Java 中,异常处理是一种常见的定位和排查 Bug 的方式。通过捕获和处理异常,我们可以获取异常信息和堆栈轨迹,以便找到问题的根源。以下是使用异常处理和调试的示例:

public class MyClass {
    public void myMethod() {
        try {
            // 代码逻辑
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们使用 try-catch 块捕获并打印异常信息。通过查看异常信息和堆栈轨迹,可以定位问题发生的位置。

4. 使用调试器

调试器是一种强大的工具,可以逐行执行代码并查看变量值和程序状态。通过在关键位置设置断点,我们可以在代码执行过程中暂停并检查状态。以下是使用调试器的示例:

public class MyClass {
    public void myMethod() {
        int x = 10;
        int y = 5;
        int result = x / y;

        // 其他代码逻辑
    }
}

在上面的示例中,我们可以在 int result = x / y; 这行代码上设置断点,并通过调试器逐行执行并观察变量值,以便查找潜在的问题。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江 流 儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值