【问题标题】:how to deal with bug "dead store to local variable" in java?如何处理java中的“死存储到局部变量”错误?
【发布时间】:2014-05-25 02:53:04
【问题描述】:

我写了一个简单的测试代码。这是一个圆圈。我想大多数人都能想象出什么是圆形类,所以我就不贴了。

在测试代码中,我尝试用无效点测试圆形构造函数,并假设抛出异常。但是出现了一个错误。我上网查了一下,还是不知道怎么解决。有没有人可以帮助我?谢谢

代码信息,bug在后面代码的最后一句

/**
 * Tests that the Circle constructor throws an exception for center Point. 
 */
@Test (expected = IllegalArgumentException.class)
public void testIllegalCenter() {
  //Instantiates a circle with an incorrect center point.
    @SuppressWarnings("unused")
    final Circle testCircle = new Circle(VALID_RADIUS, INVALID_POINT, VALID_COLOR);
}

错误报告

Bug:CircleTest.testIllegalCenter() 中 testCircle 的死存储

该指令为局部变量赋值,但在任何后续指令中都不会读取或使用该值。通常,这表示错误,因为从未使用过计算的值。

请注意,Sun 的 javac 编译器通常会为最终局部变量生成死存储。因为 FindBugs 是一个基于字节码的工具,所以没有简单的方法可以消除这些误报。

【问题讨论】:

  • 我的猜测是,由于从未使用过测试 Circle,因此编译器甚至不会编译该语句,并且永远不会调用构造函数
  • 我会针对 null 断言它
  • (offtopic)对测试代码运行 findbug 真的有用吗?
  • 你为什么要把Circle分配给一个变量呢?由于您只是在测试构造函数,因此您可以编写 new Circle(VALID_RADIUS, INVALID_POINT, VALID_COLOR); 而不进行赋值。那么你就不会收到这个错误了。
  • 如果你在测试这个类,不打印出来怎么知道输出是正确的?通过指出这一点,Findbug 正在完美地完成它的工作。请在该行之后添加一条语句,以检查是否至少有一个字段填充了您期望的内容,即。正如@Karthik Kalyanasundaram 所说的断言(testCircle.radius)

标签: java debugging findbugs


【解决方案1】:

只需删除变量并像这样调用构造函数:

@Test (expected = IllegalArgumentException.class)
public void testIllegalCenter() {
    new Circle(VALID_RADIUS, INVALID_POINT, VALID_COLOR);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2013-12-14
    • 2012-08-03
    相关资源
    最近更新 更多