【问题标题】:Change this condition so that it does not always evaluate to "false"更改此条件,使其不总是评估为“假”
【发布时间】:2018-05-07 00:34:22
【问题描述】:

我在下面的代码中收到“更改此条件,使其不会总是评估为假”的声纳问题

UserTransaction tx = null;
try {
    tx = (UserTransaction) new InitialContext()
        .lookup("java:comp/UserTransaction");
    tx.begin();

    // ...

} catch (NamingException | NotSupportedException | SystemException | CommandException e) {
    Logger.logError(getClass(), e);
    try {
        if(null != tx) {
            tx.rollback(); // gives  Change this condition so that it does not always evaluate to "false"
        }
    } catch (NullPointerException | IllegalStateException | SecurityException | SystemException rollbackt) {
        logError("Rollback exception", rollbackt);
    }

    throw new UserDefinedException("failed save incomplete order due to a command exception", e);
}

有什么好主意我们可以处理吗?

【问题讨论】:

  • 所以你每次都回滚这个事务,是吗?
  • 该代码不会编译,因为tx 是在try 块内声明的,并且不在catch 块内的范围内。如果代码确实编译,它实际上可能会解释消息,因为这意味着您有一个名为 tx另一个 变量,您已将其初始化为 null,并且永远不会分配 那个 变量另一个值,所以它总是null,而if 语句总是false
  • 嗨 Andreas,实际上你是对的,tx 没有在 try 块下定义。它是在 try 块之外定义的。
  • 然后编辑问题并显示实际代码。
  • 您使用什么版本的 SonarQube 和 SonarJava 插件?您能否尝试更新到最新版本并验证问题是否仍然存在?

标签: java sonarqube


【解决方案1】:

这里是对 sonar lint 报告的问题的解释。部分:

如果(空!= tx){ tx.rollback(); // 给出改变这个条件,使它不会总是评估为“假” }

如果你看到你写条件 "null != tx" 的方式,因为我们知道 "null" 的属性 & 如果我们将比较 "null" 等价于任何东西这是不可能的。

如果条件写成这样:

如果(交易!= null){ tx.rollback(); }

声纳 lint 问题将得到修复,因为现在将评估“tx”的值而不是检查 null 的值,如果它现在等于 null,则将执行“tx.rollback()”。

我希望这能澄清一切:)

【讨论】:

  • 这个答案是错误的。 x != nullnull != x 在逻辑上是等价的,有些人只是出于某种原因更喜欢后一种形式。
  • 嗨拉查纳,感谢您的回复!我试过了,但它仍然给出了同样的问题。
  • 这个答案是完全错误的,两种语法都是等价的,分析器会以同样的方式处理它们。
猜你喜欢
  • 2018-08-01
  • 2021-01-05
  • 2018-02-10
  • 2017-06-12
  • 2016-05-14
  • 2020-01-11
  • 2016-11-25
  • 2020-06-01
  • 2017-02-02
相关资源
最近更新 更多