如何修复Java程序中调用方法时的类型错误,实现输入3个IP地址并返回平均响应时间数组的功能
修复思路与完整代码
先直接点出你遇到的两个核心问题:
- 类型不匹配错误:
averageTime.add(getAverageTime(ip.get(i)))这里,getAverageTime返回的是ArrayList<String>,但averageTime的元素是单个String——你试图把整个列表塞进另一个列表的单个元素位置,这完全不符合类型要求。 - 输入流读取逻辑错误:
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




