有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是一个“如果”条件,它的结果是假的,但我的程序正在通过这个“如果”条件,不管怎样???(对还是错)

在我的JAVA程序中,我有一个“如果”条件:

    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)和((F)或((T)和((F)或(F‘‘)’))

因此,我的最终结果显然是错误的(Eclipse调试模式发现相同的结果) 但我的程序无论如何都要通过这个“如果”
我真的不知道为什么会发生这种情况,也许在“如果”条件下有某种限制

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

问候,

西特马克斯


共 (6) 个答案

  1. # 1 楼答案

    我同意其他人的观点,但除此之外,你只是没有以一种易读的方式来构建逻辑。下面是我对这个长谓词条件的尝试和理解:

    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
            )      
        )
    )
    
  2. # 2 楼答案

    我知道为什么会发生这种情况,因为这对于串联条件来说太复杂了

    将代码重构成一个方法(或者可能是多个),这样您就可以将内容放在多行上,添加临时变量等等,这样就可以更清楚地知道意味着什么要做,以及为什么它不做。如下所示:

    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语句工作正常

  3. # 3 楼答案

    已更新

    好吧,我在这一点上完全错了--漏掉了一些括号

    不管怎么说,我觉得伯特·F有点

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

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

    您可能需要检查它们是否相等:

     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)
                )      
        )
        )
     ){
    

    最内部的嵌套条件将OR与AND集中在同一级别。 我猜你想要的是:

     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)
                    )
                )      
        )
    )
     ){
    
  4. # 4 楼答案

    一个想法是:不要在一个语句中包含这么多荒谬的条件

    如果不加以简化,你几乎没有机会弄清楚这里发生了什么。将子表达式提取到单独的局部变量中,然后使if条件仅合并这些局部变量

    这样你就有了一个更好的机会去了解到底发生了什么。很可能您在某个地方误解了调试器

  5. # 5 楼答案

    这不是对你问题的直接回答,但我会附和其他人的看法。首先,简化你的条件逻辑;可能通过布尔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;       
    }
    
  6. # 6 楼答案

    如果.getId()返回一个字符串,那么==!=可能不会按您所想的方式工作-它将测试它们是否是相同的实例,而不是它们是否是相等的字符串。查看字符串。等于()