You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java双数组平均值计算异常:长度验证后结果错误求助

问题解决:数组长度验证后平均值计算错误

问题描述

我编写了一个Java程序用于计算两个数组元素的平均值,并且添加了验证逻辑确保两个数组长度一致。当我故意将其中一个数组设置为不同长度时,程序会弹出错误提示并让我重新输入数组长度,但此时计算出的平均值结果却不正确。除了调用compararVetores()方法的场景外,其他功能均正常。

错误原因

  1. 数组未替换:在compararVetores方法中,检测到数组长度不一致时调用lerVetor1()和lerVetor2()重新获取数组,但新生成的数组没有赋值给原有的vec1和vec2变量,后续计算仍然使用最初输入的错误长度数组。
  2. 计算逻辑顺序错误:mediaVetores方法先完成旧数组的总和、元素数计算,之后才调用验证方法,即便重新输入数组,也不会重新计算新数据的平均值。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:44:53