2010-04-20 3 views
0

Я пытаюсь решить лабиринт DFS, используя adj List для представления вершин и ребер графа. Всего имеется 12 узлов (3 строки [A, B, C] * 4 cols [0, .., 3]). Моя программа начинается с сохранения всех ярлыков вершин (A0, .. C3), насколько это хорошо, затем проверяет соседние узлы, также нет проблем, если движение возможно, оно продолжает создавать ребро, здесь его, где все идет не так ,ArrayList <String> NullPointerException

adjList[i].add(vList[j].label); 

Я использовал отладчик и обнаружил, что vList[j].label не пустой он содержит правильную строку (то есть. «B1»). Единственные переменные, которые показывают null, находятся в adjList[i], что приводит меня к мысли, что я внедрил это неправильно. вот как я это сделал.

public class GraphList { 
    private ArrayList<String>[] adjList; 
    ... 
    public GraphList(int vertexcount) { 
     adjList = (ArrayList<String>[]) new ArrayList[vertexCount]; 
     ... 
    } 
    ... 
    public void addEdge(int i, int j) { 
     adjList[i].add(vList[j].label); //NULLPOINTEREXCEPTION HERE 
    } 
    ... 
} 

Я действительно буду стремиться, если кто-то может указать мне на правильный трек, регрессирующий к тому, что пойдет не так ... Спасибо!

+1

Что нужно сделать, это изменить код на один оператор в строке. adjList [i] .add (vList [j] .label); должен быть ArrayList alTmp = adjList [i]; WhateverType vTmp = vList [j]; Строковая метка = vTmp.label; alTmp.add (label); А затем посмотрите, где вы столкнулись с проблемой с отладчиком –

ответ

3

Вы создали массив, но вам все равно нужно пройти и создать объекты ArrayList. Как написано, adjList[i] возвращает null, потому что ему еще ничего не назначено.

+0

@Joel: Правильно ли было бы кодировать этот «adjList [i] .contains (vList [j] .label)» – Carlos

+0

Ваш метод addEdge в порядке. Вы просто не инициализируете свои структуры данных правильно. Вам нужен цикл с вашим конструктором с помощью 'adjList [i] = new ArrayList ();' Альтернативно, вы можете изменить addEdge для проверки на null и создать ArrayList, если он еще не существует. – Joel

1

Я вижу, что вы создали контейнер, но уверены, что вы заполнили список элементами? Почему бы вам не добавить assert((adjList[i] != null) && (adjList[j] != null)) в addEdge, чтобы убедиться, что любой из них не является null. Запуск с java -ea ...

Смежные вопросы