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

自定义Graph类getVertex方法异常:无法返回对应Vertex对象

排查Graph类getVertex方法返回null的问题

我太懂这种明明预期应该返回顶点结果,却拿到null的郁闷了!结合你描述的场景,咱们从几个常见的坑点入手排查:

1. 对象匹配逻辑用了引用比较而非内容比较

如果你的getVertex方法里是用==来判断传入的Verschiebung和顶点中存储的是否一致,那大概率会出问题——==比较的是对象引用,只有当两个变量指向同一个内存对象时才会返回true,而如果是两个内容相同但不同实例的Verschiebung,就会匹配失败。

举个错误和正确的示例:

// 错误:用==比较引用
public Vertex getVertex(Verschiebung target) {
    for (Vertex v : this.vertices) {
        if (v.getVerschiebung() == target) { // 这里只会匹配同一个引用的对象
            return v;
        }
    }
    return null;
}

// 正确:用equals比较内容(前提是Verschiebung重写了equals)
public Vertex getVertex(Verschiebung target) {
    for (Vertex v : this.vertices) {
        if (v.getVerschiebung().equals(target)) { // 比较对象的内容是否一致
            return v;
        }
    }
    return null;
}

同时要注意:必须给Verschiebung类正确重写equals()和hashCode()方法,不然默认继承自Object的equals还是会比较引用,等于白改。比如如果Verschiebung是用i和j来标识的,重写的equals应该对比这两个属性的值。

2. 目标顶点根本没被添加到Graph中

你提到feld数组里填充了Planquadrat对象,但要确认:这些Planquadrat关联的Verschiebung对应的Vertex,是不是真的被添加到了Graph的顶点集合里?

比如你可能在初始化feld的时候,只创建了Planquadrat,但忘了调用Graph的addVertex方法把对应的Vertex加进去。可以在添加顶点的地方加个调试输出:

// 初始化feld时的代码片段示例
for (int x = 0; x < feld.length; x++) {
    for (int y = 0; y < feld[x].length; y++) {
        Verschiebung v = new Verschiebung(x, y);
        Vertex vertex = new Vertex(v);
        feld[x][y] = new Planquadrat(vertex);
        // 确认这行代码存在!
        this.addVertex(vertex);
        System.out.println("已添加顶点:" + v); // 调试用,打印添加的顶点信息
    }
}

然后在调用getVertex之前,遍历Graph的所有顶点打印出来,看看目标Verschiebung对应的顶点是不是真的在集合里。

3. 传入的Verschiebung参数和存储的对象内容不一致

检查你调用getVertex时传入的Verschiebung对象,它的i和j值是不是和存储在顶点里的完全一致?比如有没有可能传入的i/j搞反了,或者数值有偏移?

可以在getVertex方法开头加个调试打印:

public Vertex getVertex(Verschiebung target) {
    System.out.println("传入的Verschiebung参数:i=" + target.getI() + ", j=" + target.getJ());
    // 遍历顶点时也打印每个顶点的Verschiebung信息
    for (Vertex v : this.vertices) {
        Verschiebung stored = v.getVerschiebung();
        System.out.println("存储的Verschiebung:i=" + stored.getI() + ", j=" + stored.getJ());
        if (stored.equals(target)) {
            return v;
        }
    }
    return null;
}

这样对比一下,就能看出参数和存储的对象是不是真的匹配。

4. 顶点集合本身未正确初始化

最后检查一下Graph类里的顶点集合(比如List<Vertex> vertices)是不是在构造函数里正确初始化了?比如有没有写:

public class Graph {
    private List<Vertex> vertices;

    public Graph() {
        this.vertices = new ArrayList<>(); // 这行不能少!
    }
}

如果vertices一直是null,遍历的时候会抛异常,但如果是空集合,那getVertex自然会返回null——这时候就要回到第二步,确认顶点有没有被正确添加进来。

如果按照这些步骤排查后还是找不到问题,建议把getVertex方法的完整代码,以及顶点添加到Graph的代码片段贴出来,这样能更精准地定位问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:00:33