2 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
NullPointerException因?yàn)槟?for 循環(huán)開(kāi)始后對(duì)列表進(jìn)行空檢查children。應(yīng)該在進(jìn)入循環(huán)之前完成。另外,我注意到您沒(méi)有匯總結(jié)果,每次調(diào)用getJobChildren()您都會(huì)實(shí)例化一個(gè)新列表,并且您沒(méi)有在方法返回時(shí)將其添加到父調(diào)用中。
用于遍歷子列表(假設(shè)沒(méi)有循環(huán))的深度優(yōu)先遞歸算法可以如下:
public List<Job> getJobChildren(final Job job, final List<Job> result) {
if (job == null) {
return result;
}
result.add(job);
if(job.getChildren() != null){
for(Job current : job.getChildren()){
getJobChildren(current, result);
}
}
return result;
}
您需要使用新的 ArrayList 觸發(fā)第一次調(diào)用以收集結(jié)果。
List<Job> results = new ArrayList<>();
getJobChildren(parentJob, results);
// Use the results here.

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
您需要檢查空值:
if (job.getChildren() != null) {
for (Job k : children) {
job.getChildren() 可以為空。無(wú)需迭代空列表。
修正方法:
public static List<Job> getJobChildren(Job job) {
List<Job> result = new ArrayList<Job>();
if (job == null) {
return new ArrayList<Job>();
}
List<Job> children = job.getChildren();
if (job.getChildren() != null) {
for (Job k : children) {
if (children != null && !children.isEmpty()) {
result.addAll(children);
getJobChildren(k);
} else {
result.add(k);
}
}
}
return result;
}
添加回答
舉報(bào)