一个“if”条件,结果是假的,但我的程序正在经历这个,如果无论如何??? (对或错)

时间:2010-12-07 17:46:11

标签: java if-statement conditional-statements

在我的JAVA程序中,我有这个“if”条件:

    if(  (!pccoNettNoAff && !transOPCVM && !garantie) 
      && (  (pccoCourant == null) 
         || (  (pccoCourant != null && rBale.getPcco() != null) 
            && (  (pccoCourant.getId() != rBale.getPcco().getId()) 
               || (  pccoCourant.getId() == rBale.getPcco().getId() 
                  && tauxCourant!=null && rBale.getTauxCcf()!=null 
                  && rBale.getPartenaire()==null 
                  && rBale.getTauxCcf()!=tauxCourant
                  )
               )      
            )
         )
      )
   {

我们可以通过以下方式将其翻译成:

图例:T = true且F = False:它们是每次测试的结果

<(>((T)AND((F)OR((T)AND((F)OR(F)))))

所以我的最终结果显然是假的(Eclipse调试模式找到相同的结果) 但无论如何,我的计划正在通过这个“如果” 我真的不知道为什么会发生这种情况,也许在“if”条件中存在某种限制?

如果有人有任何想法,请帮助我:)

此致

Cytemax

7 个答案:

答案 0 :(得分:12)

我知道为什么会这样 - 因为对于内联条件来说太复杂了

将代码重构为一个方法(或者可能是几个),从而可以将事物放在多行上,添加临时变量等,并且它将变得更加清晰意味着做什么,以及它为什么不这样做。如下所示:

private boolean shouldBeActedOn(PCCO pccoCourant) {
   if (pccoCourant != null) {
      return true;
   }
   final PCCO balePcco = rBale.getPcco()
   if (balePcco != null) {
       // etc.
   }
   ...
}

// Then later, where your current block is:

  if (shouldBeActedOn(pccoCourant, otherArgs)) {
     ...
  }

请放心,Java的if语句可以正常工作。

答案 1 :(得分:8)

一个想法:在一个陈述中没有这么多荒谬的条件。

你几乎没有机会在没有简化的情况下弄清楚这里发生了什么。将子表达式提取到单独的局部变量中,然后使if条件只组合这些局部变量。

通过这种方式,您可以更好地了解正在发生的事情 。你有可能误解了调试器......

答案 2 :(得分:6)

如果.getId()返回一个字符串,==!=可能无法按照您的想法运行 - 它将测试它们是否是相同的实例,而不是它们是否是相等的字符串。查看String.equals()。

答案 3 :(得分:1)

不能直接回答你的问题,但我会回应别人所说的话。首先,简化条件逻辑;也许通过布尔algreba规则减少(如果分支过于复杂)。

让我想起学校里的卡诺图。

我喜欢为每个单独的较小条件定义局部变量,以便我可以将它们组合成一个单独的If语句。每个布尔值 可以调用单独的函数来提高可读性。

boolean isTrainingDue( int numDaysLeft ) {

  boolean trainingDue = false;
  boolean isNewUser = (userService.daysSinceSignUp() < 30);
  boolean gracePeriodExpired = (userService.daysLeft() < 1);
  boolean notCertified = 
        !ObjectUtils.isEmpty(p.getExpiredDate()) && 
         ObjectUtils.isEmpty(p.getCertifiedDate());  

  if (isNewUser && notCertified && gracePeriodExpired)
    trainingDue = (numDaysLeft <= 30);

  return trainingDue;       
}

答案 4 :(得分:0)

<强>已更新

好吧,我在这个问题上错了 - 错过了一些特别的事情......

无论如何,我认为Bert F正在做点什么......

您正在检查事物(pccoCourant和rBale.getTauxCcf())是否为空,这意味着它们是对象引用。

然后检查它们是否相同(使用==)。

你可能想检查它们是否是平等的:

 if( 
(!pccoNettNoAff && !transOPCVM && !garantie) 
&& ( 
    (pccoCourant == null) 
        || ( 
            (pccoCourant != null && rBale.getPcco() != null) 
            && ( 
                (pccoCourant.getId() != rBale.getPcco().getId()) 
                || (
                    pccoCourant.getId() == rBale.getPcco().getId() 
                    && tauxCourant!=null && rBale.getTauxCcf()!=null 
                    && rBale.getPartenaire()==null 
                    && ! rBale.getTauxCcf().equals(tauxCourant)
                )
            )      
    )
)
 ){

您可以忽略其余部分:

除了其他人提到的复杂性之外,您在以后的条件中有些含糊不清:

 if( 
(!pccoNettNoAff && !transOPCVM && !garantie) 
&& ( 
    (pccoCourant == null) 
        || ( 
            (pccoCourant != null && rBale.getPcco() != null) 
            && ( 
                (pccoCourant.getId() != rBale.getPcco().getId()) 
                || (pccoCourant.getId() == rBale.getPcco().getId() 
                && tauxCourant!=null && rBale.getTauxCcf()!=null 
                && rBale.getPartenaire()==null 
                && rBale.getTauxCcf()!=tauxCourant)
            )      
    )
    )
 ){

最里面的嵌套条件是将ANDS与ORS混合在同一级别。 我怀疑你想要的是:

 if( 
(!pccoNettNoAff && !transOPCVM && !garantie) 
&& ( 
    (pccoCourant == null) 
        || ( 
            (pccoCourant != null && rBale.getPcco() != null) 
            && ( 
                (pccoCourant.getId() != rBale.getPcco().getId()) 
                || (
                    (pccoCourant.getId() == rBale.getPcco().getId() 
                    && tauxCourant!=null && rBale.getTauxCcf()!=null 
                    && rBale.getPartenaire()==null 
                    && rBale.getTauxCcf()!=tauxCourant)
                )
            )      
    )
)
 ){

答案 5 :(得分:0)

我同意其他人的帖子,但除此之外,你只是没有以易于阅读的方式构建逻辑。这是我的尝试,并理解这个长期的谓词条件:

if(
    !pccoNettNoAff
    && !transOPCVM
    && !garantie
    && (
        pccoCourant == null
        ||
        pccoCourant != null
        && rBale.getPcco() != null
        && (
            pccoCourant.getId() != rBale.getPcco().getId()
            ||
            pccoCourant.getId() == rBale.getPcco().getId()
            && tauxCourant!=null
            && rBale.getTauxCcf()!=null
            && rBale.getPartenaire()==null
            && rBale.getTauxCcf()!=tauxCourant
        )      
    )
)

答案 6 :(得分:0)

请回答所有答案

我只是改变了我的条件,如果它似乎完美地工作;)

所以是的,我的第一个条件对于单行来说太难了“if”条件^^

再次发送

我必须使用它(rBale.getTauxCcf()。compareTo(tauxCourant))!= 0而不是rBale.getTauxCcf()!= tauxCourant。它们都是Double类型而不是double类型。我认为这是一个常见的错误,所以要把我放在怀特的轨道上。

此致

Cytemax