在我的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
答案 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