2015-10-26 55 views
-2

我有一系列8个“敲除”if语句必须通过才能显示相应的响应。如果这8个if语句中的任何一个失败,则显示相应的响应。下面是我的代码...Java嵌套如果/否则条件

if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int){ 
      if(adtV1MileageCustInt >= adtVMileageMinComp1Int && adtV2MileageCustInt >= adtVMileageMinComp1Int && adtV3MileageCustInt >= adtVMileageMinComp1Int && 
       adtV1MileageCustInt <= adtVMileageMaxComp1Int && adtV2MileageCustInt <= adtVMileageMaxComp1Int && adtV3MileageCustInt <= adtVMileageMaxComp1Int) 
       if(totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) 
        if(totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) 
         if(bodilyInjuryCust.equals(bodilyInjuryComp1)) 
          if(propDamageCust.equals(propDamageComp1)) 
           if(currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) 
            if(unUiBodilyCust.equals(unUiBodilyComp1)) 
            { 
            btnComp1.setVisible(true); 
            lblPriceComp1.setText("$ " + price1String); 
            lblPriceComp1.setVisible(true); 
            } 
     } else 
     { 
      lblPriceComp1.setText("Not Competitive"); 
     } 

我得到大多是正确的结果,但每一个现在,然后从别的块的适当“没有竞争力”的结果不被显示为它应该。我的猜测是因为else语句只适用于第一个if语句,如果该语句被传递,则else语句块不会被执行。我需要构造if语句,以便如果任何if语句失败,则会执行else块。我试图重组我的块没有成功。有任何想法吗?

+4

这个想法是:不要使用如此多的嵌套IFs ... – Andremoniy

+2

而不是嵌套如此之多的ifs,你可以将所有的条件与语句(&&)连接在一起。 –

+1

将_all_这些条件拉出到一个函数中,并用'&&'链接在一起。使用一个小的if。 –

回答

2

正如其他人建议,如果使用链接的概念,使用&&,合并的所有条件进入一个if块

最简单的可能是下面。

boolean isValid = false; 

    if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int){ 
       if(adtV1MileageCustInt >= adtVMileageMinComp1Int && adtV2MileageCustInt >= adtVMileageMinComp1Int && adtV3MileageCustInt >= adtVMileageMinComp1Int && 
        adtV1MileageCustInt <= adtVMileageMaxComp1Int && adtV2MileageCustInt <= adtVMileageMaxComp1Int && adtV3MileageCustInt <= adtVMileageMaxComp1Int) 
        if(totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) 
         if(totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) 
          if(bodilyInjuryCust.equals(bodilyInjuryComp1)) 
           if(propDamageCust.equals(propDamageComp1)) 
            if(currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) 
             if(unUiBodilyCust.equals(unUiBodilyComp1)) 
             { 
             btnComp1.setVisible(true); 
             lblPriceComp1.setText("$ " + price1String); 
             lblPriceComp1.setVisible(true); 
             } 
           isValid = true; 
      } 

//稍后检查变量值是否为true,表示它没有输入任何if语句。

if(!isValid){ 
    lblPriceComp1.setText("Not Competitive"); 
} 
+0

OP应该记得在适当的时间将代码放在下一行。 – Sweeper

+0

是的,宣布检查条件的标志是正确的决定。我同意。 –

+0

@Sweeper条件可以合并,但这只是OP现有代码的替代方案。 –

1

一个以提高可读性和解决您的报价问题是通过提取由您在使用链其他调用它们的方法(从而给他们的名字,他们在做什么)
并提到的个人条件的方式已经建议。

private boolean checkAgeLimits(int ageCustInt){ 
return (ageCustInt >= ageMinComp1Int) && (ageCustInt <= ageMaxComp1Int); 
} 
private boolean checkAdtV1MileageCustInt(int adtV1MileageCustInt){ 
... 
} 
... 
other validator methods 
... 
if (checkAgeLimits(ageCustInt) 
    && checkAdtV1MileageCustInt(adtV1MileageCustInt) 
    && .. other validators){ 
             btnComp1.setVisible(true); 
             lblPriceComp1.setText("$ " + price1String); 
             lblPriceComp1.setVisible(true); 

      } else 
      { 
       lblPriceComp1.setText("Not Competitive"); 
      } 
0

从复杂度来看,从技术上讲,关于条件语句或异常处理程序,您绝不应该超过3级。如果你想到这一点,最好的建议路线是将代码分离出来并形成自己的方法。通过这种方式,您可以以更具建设性的方式划分并征服您的逻辑,而不会让您的生活复杂化(或开发人员接管代码)。

一个例子根据您的代码库可以如下(我没有实例化对象,因为,你必须自己做):

/** 
* Add comment on the purpose of this method 
*/ 
public void someMethod() { 
    boolean isValid = false; 
    if (ageCustInt >= ageMinComp1Int) { 
     isValid = checkPointOne(); 
    } 

    if(!isValid){ 
     lblPriceComp1.setText("Not Competitive"); 
    } 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointOne() { 
    if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int) { 

     if (adtV1MileageCustInt >= adtVMileageMinComp1Int 
       && adtV2MileageCustInt >= adtVMileageMinComp1Int 
       && adtV3MileageCustInt >= adtVMileageMinComp1Int 
       && adtV1MileageCustInt <= adtVMileageMaxComp1Int 
       && adtV2MileageCustInt <= adtVMileageMaxComp1Int 
       && adtV3MileageCustInt <= adtVMileageMaxComp1Int) { 
      return checkPointTwo(); 
     } 
    } 
    return false; 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointTwo() { 
    if (totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) { 

     if (totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) { 
      return checkPointThree(); 
     } 
    } 
    return false; 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointThree() { 
    if (bodilyInjuryCust.equals(bodilyInjuryComp1)) { 
     if (propDamageCust.equals(propDamageComp1)) { 
      return checkPointFour(); 
     } 
    } 
    return false; 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointFour() { 
    if (currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) { 
     if (unUiBodilyCust.equals(unUiBodilyComp1)) { 
      activateForm(); 
      return true; 
     } 
    } 
    return false; 
} 

/** 
* This method will activate the form 
*/ 
public void activateForm() { 
    btnComp1.setVisible(true); 
    lblPriceComp1.setText("$ " + price1String); 
    lblPriceComp1.setVisible(true); 
} 

希望这可以帮助你过滤掉这是你不需要的逻辑,因为这种方法可以帮助你做出更好的编码选择,而不是踩下编码地狱的道路。祝你好运! :)