Java双数组平均值计算异常:长度验证后结果错误求助
问题解决:数组长度验证后平均值计算错误
问题描述
我编写了一个Java程序用于计算两个数组元素的平均值,并且添加了验证逻辑确保两个数组长度一致。当我故意将其中一个数组设置为不同长度时,程序会弹出错误提示并让我重新输入数组长度,但此时计算出的平均值结果却不正确。除了调用compararVetores()方法的场景外,其他功能均正常。
错误原因
- 数组未替换:在
compararVetores方法中,检测到数组长度不一致时调用lerVetor1()和lerVetor2()重新获取数组,但新生成的数组没有赋值给原有的vec1和vec2变量,后续计算仍然使用最初输入的错误长度数组。 - 计算逻辑顺序错误:
mediaVetores方法先完成旧数组的总和、元素数计算,之后才调用验证方法,即便重新输入数组,也不会重新计算新数据的平均值。 - Scanner重复创建:每次调用
lerInteiro都新建Scanner实例,可能导致输入流异常。
修正后的代码
import java.util.Scanner; public class MediaVetores { // 全局复用Scanner,避免重复创建 private static final Scanner scanner = new Scanner(System.in); public static void main(String[] args) { int[] vec1; int[] vec2; // 循环获取数组,直到长度一致 do { vec1 = lerVetor("1º"); vec2 = lerVetor("2º"); if (vec1.length != vec2.length) { System.out.println("Os vetores devem ter o mesmo número de valores! Volte a introduzir novos tamanhos de vetores."); } } while (vec1.length != vec2.length); mediaVetores(vec1, vec2); scanner.close(); // 关闭Scanner资源 } static int lerInteiro(String pergunta) { System.out.println(pergunta); return scanner.nextInt(); } // 合并两个数组读取方法,减少重复代码 static int[] lerVetor(String ordem) { int tamVetor = lerInteiro("Quantos valores quer inserir no " + ordem + " vetor?: "); int[] vec = new int[tamVetor]; for (int i = 0; i < tamVetor; i++) { vec[i] = lerInteiro("Insira o valor do " + (i + 1) + "º número do vetor: "); } return vec; } static void mediaVetores(int[] vec1, int[] vec2) { int somaTotal = 0; int totalElementos = vec1.length + vec2.length; // 计算第一个数组总和 for (int valor : vec1) { somaTotal += valor; } // 计算第二个数组总和 for (int valor : vec2) { somaTotal += valor; } double media = (double) somaTotal / totalElementos; System.out.println("A média dos valores inseridos nos vetores é de " + media); } }
关键修改说明
- 调整流程到main方法:将数组长度验证逻辑移到main中,通过循环确保获取到长度一致的数组后才进行计算,避免无效计算。
- 合并重复代码:将
lerVetor1和lerVetor2合并为一个通用的lerVetor方法,减少冗余。 - 复用Scanner:创建全局Scanner实例,避免每次读取都新建,同时在程序结束时关闭资源。
- 简化计算逻辑:使用增强for循环简化数组遍历,减少变量数量,提升代码可读性。
内容的提问来源于stack exchange,提问作者José Filipe Silva
相关产品推荐
相关产品推荐

