You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复Java程序中调用方法时的类型错误,实现输入3个IP地址并返回平均响应时间数组的功能

修复思路与完整代码

先直接点出你遇到的两个核心问题:

  1. 类型不匹配错误averageTime.add(getAverageTime(ip.get(i)))这里,getAverageTime返回的是ArrayList<String>,但averageTime的元素是单个String——你试图把整个列表塞进另一个列表的单个元素位置,这完全不符合类型要求。
  2. 输入流读取逻辑错误getAverageTime里的循环判断if (averageTime == null)完全逻辑颠倒,应该判断读取到的line是否为null;而且当前代码直接把r.readLine()加到列表,没做非空判断,会把无效的null值也存进去。

接下来一步步帮你修复:

第一步:修正方法返回值与核心逻辑

getAverageTime的返回类型从ArrayList<String>改成String——我们只需要单个平均时间值,不需要返回列表。同时彻底修正流读取和匹配逻辑:

  • 逐行读取输出,判断line是否为null来终止循环
  • 匹配到平均时间后直接返回该值,不用存列表
  • 处理ping失败或匹配不到的情况,返回友好提示

第二步:修正主方法的调用逻辑

主方法里的averageTime.add(getAverageTime(ip.get(i)))现在就合法了,因为方法返回单个String,正好匹配averageTime的元素类型。

第三步:适配本地化输出(重要)

你的提示是俄语,说明系统大概率是俄语环境,原代码里的英文"Average = "正则无法匹配俄语ping输出的"Среднее = ",必须调整正则和命令里的关键词,否则会匹配失败。

修复后的完整代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PingAverageTool {
    public static void main(String[] args) throws Exception {
        System.out.println("Введите 3 IP адреса: ");
        ArrayList<String> ipList = new ArrayList<>();
        ArrayList<String> averageTimeList = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        
        for (int i = 0; i < 3; i++) {
            String ip = scanner.nextLine().trim();
            ipList.add(ip);
            String avgTime = getAverageTime(ip);
            averageTimeList.add(avgTime);
        }
        
        // 格式化输出结果,更直观
        System.out.println("\nСредние времена отклика:");
        for (int i = 0; i < ipList.size(); i++) {
            System.out.printf("%s: %s%n", ipList.get(i), averageTimeList.get(i));
        }
        
        scanner.close();
    }

    public static String getAverageTime(String ip) throws IOException {
        // 俄语系统下的ping命令,匹配"Среднее = "关键词
        String command = String.format("ping %s | ForEach-Object {if($_ -match 'Среднее = (\\d+)'){$Matches[1]}}", ip);
        ProcessBuilder builder = new ProcessBuilder("powershell.exe", "/c", command);
        builder.redirectErrorStream(true);
        Process process = builder.start();
        
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        String averageTime = "Не удалось получить данные"; // 默认失败提示
        
        // 逐行读取输出,匹配数字时间
        while ((line = reader.readLine()) != null) {
            line = line.trim();
            Pattern pattern = Pattern.compile("(\\d+)");
            Matcher matcher = pattern.matcher(line);
            if (matcher.find()) {
                averageTime = matcher.group(1) + " ms";
                break; // 找到结果后直接退出循环,提升效率
            }
        }
        
        // 释放资源
        reader.close();
        try {
            process.waitFor(); // 等待ping进程完全结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return averageTime;
    }
}

关键修复点详解

  • 类型匹配修复:把方法返回值从列表改成单个字符串,彻底解决主方法的类型错误。
  • 流读取逻辑修复:正确判断line是否为null,避免空指针异常和无效值存入。
  • 本地化适配:将ping命令和正则适配俄语系统,确保能正确匹配平均时间。
  • 资源管理:添加了scanner.close()reader.close()process.waitFor(),避免资源泄漏。
  • 用户体验优化:格式化输出结果,添加失败提示,让结果更直观。

如果你的系统是英文环境,只需要把getAverageTime里的Среднее = 改回Average = 即可正常工作。

内容的提问来源于stack exchange,提问作者Rumeone

火山引擎 最新活动