zoukankan      html  css  js  c++  java
  • java,让debug出色

    虽然我们不喜欢bug,但是bug永远都存在。
    虽然我们牛逼,但是仍然有不知道的东西,解决不了的问题。
    so,还得借助工具,让咱效率提起来扛扛的。
    解决的问题如是:由于某种原因,其他系统发送的mq,我这边说没收到,他那边说发了。然后,一愁不展,咋办呢?好吧,肯定是抓包确认问题咯。嘿,这不是本文的重点,请自行脑补抓包。

    从对方系统的mq记录里,取出消息体,放到mq后台,直接发送到消费服务器。模拟发送情况,然后就遇到报错了,苦思不得结果后,只能使用终级绝招,就用本机来代替debug吧。
    本地服务起来之后,同样,mq后台发送消息。不出意外地,和测试服务器上报了不一样的错。这就尴尬了。和测试环境不一样,咋整呢?
    不怕,咱一步步来。按照堆栈指示的代码行,很快定位了有问题的代码。原因为某个jar包中的值报了空指针异常。咋整呢,咱们的本机环境不像测试环境呢。

    解决办法1:将本机模拟成测试环境一样的情况,太难,至少linux和windows环境就是不一样的。

    方法2:想办法让这个变量的变得和测试环境一样。也许可行。

    方法3:想办法跳过报错的代码,使其继续后面的程序,存在2个问题,1是程序做不到跳过不执行功能,2是跳过执行后后续可能使用这里的值,会导致其他错误。故此,只有改变变量值一法了。

    案例1:改变一个基本类型变量的值
    直接setvalue即可。

     public static void main(String[] args) {
            String var1 = "var1";
            int i = 1;
            System.out.println("var1:" + var1);    // 输出 var1:changed
    
      }

    案例2:改变一个hashmap变量的值

    hashmap是个复杂类型,不能直接设置值。需要使用 add to watches功能。

        public static void main(String[] args) {
            Map<String, Object> map = new HashMap<>();
            int i = 2;
            System.out.println("map:" + map);  // 输出 map:{name:hello}
    
        }

    案例3:改变一个实体对象值
    可以使用set value 方式直接改变值,也可以使用add to watches操作代码来设置 。 总之你想要都能给你变出来。

        public static void main(String[] args) {
            UserInfo info = new UserInfo();
            int i = 3;
            System.out.println("info:" +  info);  //输出info:UserInfo{id='123', name='null', sex='null', age=null, address='golden street'}
        }

    报的错是找不到某个处理方法,但是实际上我自认为已经写了某个方法。那么到底怎么回事呢。
    第一次跟踪,到某一行后,退出了程序。debug往下调整。进入方法再进行单步调试。再次发现某一次代码退出。最后定位到反射调用的这一行。原因是之时的入参类型,与现有入参类型不一致。再往前分析,是因为在调用转换器的时候,并没有进行相应的转换,而是以原来的二进制格式返回了。分析程序,知道里面某参数需要包含某值,转换器才会起作用。对症下药,给他这个参数,果然进入到了转换流程。然而,进入后又转换成另一个不可预料的参数了,没办法,getmapper方法不好模拟出来,还是算了,直接模拟转换结果吧,add to watch,改变值。这下,终于进入方法了,代码不再报错。测试通过了。
    弄清原理之后,解决就简单了!如果对方没有设置某属性值,让其设置就ok了。如果一定要以某结构参数进行接收处理,那变写一个对应的处理方法即可。小case。

    debug,单步调试,进入,退出,计算变量值,推测执行是debug基础,必备。

    debug, 让问题变得简单!

  • 相关阅读:
    hdu4651(广义五边形数 & 分割函数1)
    Java基础面试题1
    Java8新特性--Lambda表达式
    Java中list在循环中删除元素的坑
    Java多线程面试题整理
    Java并发包--ConcurrentHashMap原理解析
    HashMap原理解析
    Java原子类--AtomicLongFieldUpdater
    Java原子类--AtomicReference
    Java原子类--AtomicLongArray
  • 原文地址:https://www.cnblogs.com/yougewe/p/9351309.html
Copyright © 2011-2022 走看看