У меня есть вопрос относительно ResultSet
объектов в Java и рекурсии.
Я работал над некоторым кодом для университета, и всякий раз, когда я находил потомка, я возвращался к этому новому узлу, но когда я выходил из рекурсии и пытался rs.next (), указатель уходил от указания на строку 1 назад в строку 0, и когда он достиг строки 0, произошел сбой rs.next (), и он вернулся! Я знал, что там была одна вещь, которую она еще не читала! Что вызывает это?
Единственный способ обойти эту проблему - пройти набор результатов, получить каждый элемент и добавить его в список массивов, а затем перебрать массив, выполняя рекурсию для каждого элемента массива! Конечно, это должно быть лучший способ обойти это?
Это новый код, который я использую
private Vector<String> getDescendents(String dogname, Vector<String> anc) {
if (anc == null) anc = new Vector<String>();
ArrayList<String> tempList = new ArrayList<String>(2);
try {
System.out.println("Inside ");
childStmt.setString(1,dogname);
childStmt.setString(2,dogname);
ResultSet rs = childStmt.executeQuery();
System.out.println("Before while "+rs.getRow());
while (rs.next()){
String col1 = rs.getString(1);
tempList.add(col1);
anc.add(col1);
}
for (String s:tempList){
getDescendents(s,anc);
}
}
catch(Exception e) {
doError(e, "Failed to execute ancestor query in getBreeding");
}
return anc;
}
Однако до этого у меня был вызов getDescendents
внутри цикла while
и, следовательно, нет цикла for и нет никакого arraylist, но всякий раз, когда он действительно рекурсивен, он теряет отслеживание набора результатов, когда он возвращается из рекурсии.
Более подробная информация:
Когда я использовал отладчик (почти сказал, что GDB там слишком много C), идентификатор набора результатов был таким же, но указатель строки вернулся к 0, и вызов rs.next не удался!
Еще раз приветствуется любое объяснение!
p.s ранее это выглядело как
private Vector<String> getDescendents(String dogname, Vector<String> anc) {
if (anc == null) anc = new Vector<String>();
ArrayList<String> tempList = new ArrayList<String>(2);
try {
System.out.println("Inside ");
childStmt.setString(1,dogname);
childStmt.setString(2,dogname);
ResultSet rs = childStmt.executeQuery();
System.out.println("Before while "+rs.getRow());
while (rs.next()){
String col1 = rs.getString(1);
anc.add(col1);
getDescendendts(col1,anc);
}
}
catch(Exception e) {
doError(e, "Failed to execute ancestor query in getBreeding");
}
return anc;
}