【问题标题】:Java If-else programming logicJava If-else 编程逻辑
【发布时间】:2016-09-14 11:37:01
【问题描述】:

基本上我已经修复了一个错误。修复已经奏效,但现在我想知道我的逻辑是否有缺陷。我在下面粘贴了我的代码。基本上我想知道标有<-- 的两行是否有问题。我已经写了if data.length >=0,那么它等于真,还有else-if data.length && _routing,那么它也等于真。我的逻辑有问题吗?我的 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

【问题讨论】:

  • 您能否正确格式化您的代码 sn-p 并将任何标记(如 * )添加为 cmets?更容易阅读和发现错误。
  • 我明白了,应该怎么改?
  • 我需要满足 else-if 条件
  • 所以基本上它的 if data.length >=0,,,,,,,, 以及如果它的 ==0 && _routing,这是另一个条件

标签: java if-statement logic


【解决方案1】:

我想到的一个缺陷:

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

else-if 分支永远不会被采用,因为当到达该语句时,data.length 已被确认为 > 0。

相反,您可能会摆脱 data.length &gt;= 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 
}

【讨论】:

  • 是的,这就是我所害怕的
  • 有什么办法可以绕过它吗?
  • 我可以先放 _routing 然后 data.length == 0 ,,,, 可以吗
  • @WilliamChang 可能,只有你知道程序应该做什么。那会做程序应该做的事情吗?
  • @WilliamChang 您可能只想摆脱data.length &gt;= 0 条件。我会相应地编辑我的答案,但请注意,正如彼得所说,它可能不会做 想要它做的事情,所以请谨慎对待。
【解决方案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 块;如果:

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...
}

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

【讨论】:

  • 啊,好吧,我明白了你的逻辑,基本上我应该取出 else-if,然后有 if-else 和另一个 if。以确保满足条件。我的理解正确吗?
  • 所以我可以在那里添加空的 else 语句?不需要任何东西,因为它需要 data.length
【解决方案3】:
if(data.length>0)   ---------(1)
 {
      if(data.length>=0)      ---------(2)
      {
            ...
      }else (data.length==0)&&(routing))    -----(3)
      {
      }
}

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

【讨论】:

  • if (data.length >= 0) { ...block-1... } else // 此时不变:data.length
  • 我非常喜欢这个答案并想尝试一下。如果满足 >=0 ,,,,,,,,,, else
  • 一个新的 if 条件 if ==0 && _routing
  • 两个语句都可以达到吗?
  • 因为它们有两个 if 语句
猜你喜欢
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多