Java If-else编程逻辑

时间:2016-09-14 11:37:02

标签: java if-statement logic

基本上我已经修复了一个bug。修复工作有效,但现在我想知道我的逻辑是否存在缺陷。我在下面粘贴了我的代码。基本上我想知道标有<--的2行是否存在问题。我写过if data.length >=0然后它等于true,还有else-if data.length && _routing,那么它也等于true。我的逻辑有缺陷吗?我的else-if条件是否会被满足,还是会导致问题?我在查看它时遇到了一些麻烦,可以使用一些帮助。如果它有缺陷,我应该怎么做呢?谢谢

if(data.length > 0) {
  if(data.length >= 0) { //<--
    if (_outStr == null){
      _receivedFileContent = true;
      fileCreate();
    }
    _outStr.write(data);
  } else if (data.length == 0 && _routing) { //<--
    _receivedBytearrayZero = true;
  }
} //added during edit for completeness

3 个答案:

答案 0 :(得分:3)

我想到了一个缺陷:

if(data.length > 0) {
  if(data.length >= 0) {
   ...
  } else if (data.length == 0 && _routing) {
   ...
  }
}

由于data.length已被确认为&gt;,因此永远不会采取else-if分支。达到该陈述时为0。

相反,您可能会摆脱data.length >= 0条件,因为这看起来多余:

if(data.length > 0) {
  ... //e.g. write to stream
} else if (data.length == 0 && _routing) {
  ... //got no data but _routing is true so do whatever is appropriate
}

我也重构了这一部分:

if (_outStr == null){
  _receivedFileContent = true;
  fileCreate();
}
_outStr.write(data);

这里的问题是首先检查_outStr是否为空并在这种情况下进行一些初始化。我假设 fileCreate()将初始化_outStr,因此您无法在最后一行获得NPE,但这很难阅读并需要假设或不得不寻找使代码更脆弱的其他地方。

在不知道fileCreate();正在做什么的情况下,我更喜欢_outStr = fileCreate();之类的内容。这样你至少可以看到流被初始化,如果它之前为null。也许您可能还想将整个块放入一个单独的方法,如writeToStream(data)并处理内部检查:

if(data.length >= 0) {
  writeToStream(data); //takes care of initializing the stream if necessary 
}

答案 1 :(得分:2)

根据不变量进行思考是一个很好的工具。

if (data.length >= 0) {
     ...block-1...
} else 
// invariant at this point: data.length < 0
if (data.length == 0 && _routing) {
     ...block-2...
}

显然,无法输入else if分支。

但这仅分析了内部的if-block;你还有一个周围的if:

if (data.length > 0) {
   //invariant at this point: data.length > 0
   if (data.length >= 0) { // implied by the invariant, collapses to true
      ...block-1...
   } else if (data.length == 0 && ...) { // false by invariant, unreachable
      ...block-2...
 }

通过消除冗余检查和无法访问的代码简化了我们:

if (data.length > 0) {
  ...block-1...
}

此代码与您发布的代码具有相同的行为。

答案 2 :(得分:0)

if(data.length>0)   ---------(1)
 {
      if(data.length>=0)      ---------(2)
      {
            ...
      }else (data.length==0)&&(routing))    -----(3)
      {
      }
}

内部if语句的else部分(标记为3的语句)不会被遇到,因为外部if(语句标记为1)本身确保data.length总是大于0.这意味着,有不需要检查条件data.length = 0的内部else条件。如果else条件是OR运算符;有可能被执行。但是,因为它的AND运算符和一个总是FALSE;这意味着,它永远不会被执行。