Java数组相邻元素乘积最大值计算:含负数数组输出异常排查
问题排查与解决
我来帮你梳理下代码里的问题,这些点导致了负数数组场景下的错误输出:
核心问题分析
1. 最大值初始值设置错误
你把maxsofar初始化为0,但如果数组中所有相邻元素的乘积都是负数,0会比所有负数都大,最终程序会错误地返回0,而不是实际的最大乘积(比如所有乘积里最接近0的负数)。
2. 循环逻辑存在死循环隐患
你的x++语句写在了while循环的大括号外面,这意味着循环体内永远不会更新x的值,x始终为0,循环条件x < inputArray.length -1永远成立,程序会陷入死循环。你提到普通数组能运行,应该是粘贴代码时的格式失误,正确写法必须把x++放到循环体内部。
3. 整数溢出风险
inputArray[x] * inputArray[x+1]用int类型存储时,如果两个绝对值较大的整数相乘(比如Integer.MAX_VALUE * 2或者-100000 * -100000),会触发整数溢出,导致计算结果完全错误,应该用long类型来存储乘积。
修正后的代码
public static void main(String args[]) { int[] inputArray = {-5, 8, -9, 1, -5, 4}; // 处理数组长度不足2的边界情况,避免数组越界 if (inputArray.length < 2) { System.out.println("数组长度至少为2才能计算相邻元素乘积"); return; } int x = 0; // 初始化为第一组相邻元素的乘积,彻底避免0对负数场景的干扰 long maxsofar = (long) inputArray[x] * inputArray[x + 1]; x++; // 先移动索引,因为已经计算了第一组 while (x < inputArray.length - 1) { // 强制转换为long计算,防止整数溢出 long currentmax = (long) inputArray[x] * inputArray[x + 1]; // 用Math.max更直观,也可以保留三元运算符 maxsofar = Math.max(maxsofar, currentmax); x++; // 循环内更新索引,确保循环能正常终止 } System.out.println(maxsofar); }
测试验证
针对你提供的数组{-5, 8, -9, 1, -5, 4},相邻元素的乘积分别是:
-5 * 8 = -408 * -9 = -72-9 * 1 = -91 * -5 = -5-5 * 4 = -20
修正后的代码会正确返回最大的乘积-5,而不是之前的0。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

