Java 计算绝对值的错误尝试

Java 计算绝对值的错误尝试,java,jenkins,Java,Jenkins,詹金斯用这张纸条警告我: 计算有符号32位哈希代码绝对值的错误尝试 该代码生成一个hashcode,然后计算该hashcode的绝对值。如果hashcode是Integer.MIN\u VALUE,那么结果也将是负数(因为Math.abs(Integer.MIN\u VALUE)==Integer.MIN\u VALUE) 在2^32个字符串中,有一个字符串的哈希代码为整数.MIN_值,包括“Polygene润滑剂”、“GydZG_”和“设计工作室” 有人知道我为什么得到这个计算绝对值的警告吗?

詹金斯用这张纸条警告我:

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

该代码生成一个hashcode,然后计算该hashcode的绝对值。如果hashcode是
Integer.MIN\u VALUE
,那么结果也将是负数(因为
Math.abs(Integer.MIN\u VALUE)==Integer.MIN\u VALUE

在2^32个字符串中,有一个字符串的哈希代码为
整数.MIN_值
,包括“Polygene润滑剂”、“GydZG_”和“设计工作室”


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

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


Integer.MIN\u VALUE=-(2^31)和Integer.MAX\u VALUE=2^31-1。因此,从纯数学的角度来看,Integer.MIN\u VALUE的绝对值不等于Integer.MAX\u VALUE。它很少出现,可能会引起问题,这就是它警告您的原因。

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

您正在对哈希代码调用
Math.abs()
。整数从−2147483648到2147483647。由于最大值为2147483647,
Math.abs(-2147483648)
返回-2147483648,因为没有2147483648。如果字符串哈希代码为-2147483648,则
服务器
变量将被指定为负值,这可能会导致查询被删除或服务崩溃

与其这样做,不如先做模数,然后调用
Math.abs()


你的问题是什么?为什么我对这个计算绝对值得到了这个警告?+1不应该在abs之外吗?Mod可以在java中返回一个负数。我不明白+1如何解决这个问题。而且它看起来会以这种方式大幅增加越界异常的数量。假设你有10台服务器,MIN_INT%10将给出-8…+1=-7。如果我认为真正的解决方案是对MIN_INT进行特殊处理。但是thx!原始问题中存在+1,所以我保留了它。我编写的代码的作用是映射q.hashCode()的任何可能结果设置为介于1和solrLoadBalanceNumOfServers(含)之间的值。我的解决方案的要点是首先执行mod,然后执行Math.abs()。
        int server = (Math.abs(q.hashCode()) % solrLoadBalanceNumOfServers) + 1;
int server = Math.abs(q.hashCode() % solrLoadBalanceNumOfServers) + 1;