【问题标题】:checking the condition in java leading to error检查java中导致错误的条件
【发布时间】:2020-07-19 13:56:37
【问题描述】:

我有下面的代码,在 if 条件下我得到声纳 检查相等性时,字符串文字的结果应放在左侧。请告知如何克服这个问题。

final String aviid = avcMaster.getAVMaster().getAviiId();
if ((!aviid.equals("44")) || (!aviid.equals("55"))) { // ** Sonar Issue **//
    final String defaultAiId = "88";
    deviceElement.setAttribute("avi", defaultAiId);
}
else{
    deviceElement.setAttribute("avi", aviid);
}

【问题讨论】:

  • 如果您的aviid 不为空,那么(!aviid.equals("44")) || (!aviid.equals("55")) 始终为真。
  • 另外,你知道吗:if ((!aviid.equals("44")) || (!aviid.equals("55"))) 你能举一个例子吗?不返回真?
  • 我想你想用&&而不是||...
  • 你的意思可能是deviceElement.setAttribute("avi", aviid.matches("44|55")? aviid: "88");

标签: java java-8 sonarqube


【解决方案1】:

String 变量与String 文字的比较

  • 在变量上调用方法:如果变量为空,你会得到一个NullPointerException

    aviid.equals("44") 
    
  • 在文字上调用该方法:您无法获得 NPE,并且您将拥有 false,以防变量包含 null

    "44".equals(aviid)
    

Sonar 会警告您,因为对于它来说,最好弄错而不是 NPE,但代码是您的选择。


你的测试也是错误的,因为它总是正确的,因为你不能同时有 44 和 55,其中一个是正确的,你肯定是指&&,你最好也这样做它是另一种方式,你不需要否定。

if ((!aviid.equals("44")) && (!aviid.equals("55"))) { 

并且做得更短(来自 cmets)

deviceElement.setAttribute("avi", aviid.matches("44|55") ? aviid : "88");

【讨论】:

  • 这是正确的,但假设在null 的情况下使用false 而不是NullPointerException 更好,这是值得怀疑的。
  • @Holger 我没有对要使用的那个发表意见:)
  • 我知道,Sonarqube 确实……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2014-10-11
相关资源
最近更新 更多