基本上我已经修复了一个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
答案 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;这意味着,它永远不会被执行。