2

我收到了关于 Sonar 的警告,认为这是违规行为。我需要适当的解决方案来从声纳中删除此警告。

我的代码是这样的:

void method(){
try {
  int x;
  x=5;
 }
 catch{
    //handling code
 }
}

我收到此代码的警告,例如:

'5' is a magic number.

所以,我想要适当的解决方案来消除这样的警告。

4

3 回答 3

6

幻数是代码中数字的直接使用(即代码中的硬编码数字在您的情况下直接使用 5)

摆脱警告试试这个:

 int x;
 static final int SOME_NUMBER=5;
 x=SOME_NUMBER;
于 2013-01-18T12:44:29.570 回答
6

Sonar 要求您通过命名来记录您使用该特定号码的原因。您可以通过声明一个常量(使用富有表现力的名称)来做到这一点:

static final int NUMBER_OF_RETRIES = 5;

然后使用该常数而不是“魔术”数字,从而更清楚地表达该分配的意图:

x = NUMBER_OF_RETRIES;

这还有一个好处是,如果需要更改 NUMBER_OF_RETRIES,您可以在一个地方进行更改,而不是使用那个“神奇”数字的任何地方。

于 2013-01-18T12:50:08.470 回答
3

好吧,我知道这个问题已经得到了令人满意的回答,但我想在这里添加自己的声纳解释,因为它已经很好地阐述了:

幻数是一个突然出现的数字,直接在语句中使用。幻数经常被使用,例如限制循环的迭代次数,测试属性的值等。

当您编写一段代码时,使用幻数可能看起来很明显和直接,但在调试时它们就不那么明显和直接了。

这就是为什么在使用之前必须首先将幻数分配给明确命名的变量来揭开幻数的神秘面纱。

-1、0 和 1 不被视为幻数。

不合规代码示例

public static void doSomething() {
  for(int i = 0; i < 4; i++){                 // Noncompliant, 4 is a magic number
      ...
  }
}

合规解决方案

public static final int NUMBER_OF_CYCLES = 4;
public static void doSomething() {
  for(int i = 0; i < NUMBER_OF_CYCLES ; i++){
    ...
  }
}

例外

此规则忽略 hashCode 方法。

于 2018-02-09T15:28:17.967 回答