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

Java计算相邻城市最短距离报City.getX()空指针错误如何解决

Java相邻城市查找代码问题修复

错误根因

  • 初始化城市数组时仅创建了City实例,未将实例赋值到数组对应位置,导致cityArr所有元素为null,触发空指针异常
  • 遍历相邻城市对时的循环边界错误,当i取到数组最后一个下标时,i+1会超出数组范围,触发数组越界异常
  • 欧几里得距离计算逻辑错误,你当前写的Math.sqrt(newX) + Math.sqrt(newY)不符合公式要求,正确公式为√(x差² + y差²)
  • 方法返回值不符合需求,需求要求返回最近相邻城市的名称,当前方法仅返回最小距离整数值,且未记录最小距离对应的城市下标

修复后代码

首先补充City类的标准实现(如果你的City类已有对应逻辑可跳过):

public class City {
    private String name;
    private int r;
    private int x;
    private int y;

    public City(String name, int r, int x, int y) {
        this.name = name;
        this.r = r;
        this.x = x;
        this.y = y;
    }

    public String getName() {
        return name;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    @Override
    public String toString() {
        return "City{" +
                "name='" + name + '\'' +
                ", x=" + x +
                ", y=" + y +
                '}';
    }
}

修复后的Maincity类代码:

public class Maincity {
    public static void main(String[] args) {
        City [] cityArr = new City[10];
        String[] nameArr = new String[] {"Hadera","Beer Sheva","Haifa", "Ashdod", "Eilat", "Jerusalem", "Ashkelon", "Tel Aviv", "Hertzila", "Netanya"};

        for (int i=0;i<cityArr.length;i++) {
            int rRandom = (int)(Math.random() * 100000) + 10000;
            int xRandom = (int)(Math.random() * 10000) + 1000;
            int yRandom = (int)(Math.random() * 10000) + 1000;
            // 修复点1:将创建的City实例存入数组
            cityArr[i] = new City(nameArr[i], rRandom, xRandom, yRandom);
            System.out.println(cityArr[i]);
        }

        // 直接输出最近的相邻城市对
        System.out.println("最近的相邻城市对为:" + getNearestAdjacentCities(cityArr));
    }

    // 修复点2:修改方法返回值为字符串,返回城市名称
    public static String getNearestAdjacentCities(City[] city) {
        int minDistance = Integer.MAX_VALUE;
        // 记录最小距离对应的第一个城市下标
        int minIndex = 0;
        // 修复点3:修改循环边界,i最大取到倒数第二个下标
        for (int i = 0; i < city.length - 1; i++) {
            int xDiff = city[i].getX() - city[i + 1].getX();
            int yDiff = city[i].getY() - city[i + 1].getY();
            // 修复点4:修正距离计算逻辑
            int distance = (int) Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2));
            if (distance < minDistance) {
                minDistance = distance;
                minIndex = i;
            }
        }
        // 返回两个城市的名称
        return city[minIndex].getName() + " 和 " + city[minIndex + 1].getName();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:45:03