#踩坑—多判断条件放在一条if语句中导致的问题

180 阅读1分钟

问题的出现是这样的,这是一个Android项目,客户要求把isDebug开关关掉看一个问题,我不想注释代码,所以直接在最后设置isDebug=false(加****的一行),但运行发现不生效,还是走的开发分支。

public static boolean isDebug = false;
    public static String ENVIRONMENT_TYPE = "D"; //   投产必须改  4
    static {
        if (ENVIRONMENT_TYPE.equals("P2") || ENVIRONMENT_TYPE.equals("P") || ENVIRONMENT_TYPE.equals("P3") || ENVIRONMENT_TYPE.equals("P4")) {
            isDebug = false;
            Log.i("dingch", "if - " + Constans.isDebug);
        } else {
            isDebug = true;
            Log.i("dingch", "else - " + Constans.isDebug);
        }
        isDebug = false; // ****添加的这一句
        Log.i("dingch", "static2 - " + isDebug);
    }

看代码怎么也找不到原因,这是有个做ios的同事提了个门外汉意见,在上面的地方加日志打印,我很不屑,但敷衍他一下,然后运行日志很意外,后面的修改(****这一句)并没有生效。日志如下:

I/dingch: else - true
I/dingch: static2 - true // 

我没有回退修改,所以之后偶然发现编译的debug包,打印是正常的。反编译代码(如下)发现问题了。

 if ((!(j.equals("P2"))) && (!(j.equals("P"))) && (!(j.equals("P3"))))
    {
      if (!(j.equals("P4")))
      {
        f = true;
        localStringBuilder = new StringBuilder();
        localStringBuilder.append("else - ");
        localStringBuilder.append(f);
        Log.i("dingch", localStringBuilder.toString());
      }
    }
    else
    {
      f = false;
      localStringBuilder = new StringBuilder();
      localStringBuilder.append("if - ");
      localStringBuilder.append(f);
      Log.i("dingch", localStringBuilder.toString());
    }
    localStringBuilder = new StringBuilder();
    localStringBuilder.append("static2 - ");
    localStringBuilder.append(f);
    Log.i("dingch", localStringBuilder.toString());

对比java代码何class代码,可以看出运行逻辑是不一样的。(不过debug包反编译出的class文件都是空的)。我记得有代码检查插件的提示,不要把超过3个判断条件放在一个if条件中,今天终于踩到这个坑了。不过为什么会出现这样的问题。