计算绝对值的不良尝试

时间:2014-05-01 20:43:10

标签: java jenkins

        int server = (Math.abs(q.hashCode()) % solrLoadBalanceNumOfServers) + 1;
詹金斯警告我这个说明:

  

计算有符号32位哈希码的绝对值的错误尝试

此代码生成哈希码,然后计算该哈希码的绝对值。如果哈希码为Integer.MIN_VALUE,那么结果也将为负(从Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE开始)。

2 ^ 32个字符串中有一个的hashCode为Integer.MIN_VALUE,包括“polygenelubricants”“GydZG_”和“”DESIGNING WORKHOUSES“。

有谁知道为什么我得到这个计算绝对值的警告?

2 个答案:

答案 0 :(得分:13)

警告本身解释了您收到警告的原因。

您在哈希码上调用Math.abs()。整数从-2,147,483,648到2,147,483,647。由于最大值为2,147,483,647,Math.abs(-2,147,483,648)返回-2,147,483,648,因为没有2,147,483,648。如果你的String哈希值编码为-2,147,483,648,那么server变量将被赋值为负值,这可能导致查询被删除或服务崩溃。

不是这样做,而是先做模数,然后调用Math.abs()

int server = Math.abs(q.hashCode() % solrLoadBalanceNumOfServers) + 1;

答案 1 :(得分:3)

首先,错误可能来自FindBugs(link)而不是Jenkins本身。它只是在Jenkins中运行/显示。

Integer.MIN_VALUE = - (2 ^ 31)和Integer.MAX_VALUE = 2 ^ 31-1。因此,从纯粹的数学角度来看,Integer.MIN_VALUE的绝对值不等于Integer.MAX_VALUE。它很少会出现并可能导致问题,这就是它警告你的原因。