Java getParent返回null

时间:2013-04-12 22:22:29

标签: java performance

我是Java新手,所以请耐心等待。我有一个必要的类获取页面的父级并返回它。当我导航到节点的顶部时,我得到一个空指针异常,这是读取的行(Page page = to ........ 我理解为什么因为在顶部节点没有父节点。如果用户导航到顶级节点,如何防止我的代码生成错误并正常显示消息。

班级代码:

public class Pages {
public static List<Page> getPath(Page from, Page to) {
    if (from == null || to == null) throw new IllegalArgumentException();

    List<Page> path = new ArrayList<Page>();
    for (Page page = to.getParent(), last = from.getParent(); page != null && !(page.getPath().equals(last.getPath())); page = page.getParent())
        path.add(page);
    Collections.reverse(path);
    return path.contains(from) ? path : null;
}

}

JSP代码:

Page rootPage = resourceResolver.adaptTo(PageManager.class).getPage(properties.get("rootNode",Page)currentPage).getPath()));
List<Page> listPages = Pages.getPath(rootPage, currentPage);

for (Page showContent : listPages) {
%>
<li><a href="#">listPages.getDisplayTitle(showContent)) %></a></li>
<%
} //end page for loop

4 个答案:

答案 0 :(得分:1)

由于您请求了一个示例:

public class Pages {
public static List<Page> getPath(Page from, Page to) {
    if (from == null || to == null) throw new IllegalArgumentException();

    List<Page> path = new ArrayList<Page>();
    Page page=to.getParent();
    Page last=from.getParent();
    // I'm assuming getPath() can be null occassionaly and is a String
    String lastPath;
    if(last!=null && (lastPath=last.getPath())!=null){
    // The assignment above is an acceptable one, as it saves a nested if statement
        // traverse your path
        while(page!=null && page.getPath()!=null && !(page.getPath().equals(lastPath))) {
            path.add(page);
            page=page.getParent();
        }
    }
    Collections.reverse(path);
    return path.contains(from) ? path : null;
}

值得注意的是,如果您为“from”或“to”参数输入“null”,这段代码仍会破坏您的页面,因为在这种情况下您抛出了新的IllegalArgumentException。我更喜欢在实际的java后端处理尽可能多的逻辑和错误处理,并且尽可能少地处理jsp前端。如果存在无效的参数,可能的改进可能只返回一个空列表。

public class Pages {
public static List<Page> getPath(Page from, Page to) {
if (from == null || to == null) return new ArrayList<Page>();

List<Page> path = new ArrayList<Page>();
Page page=to.getParent();
Page last=from.getParent();
// I'm assuming getPath() can be null occassionaly and is a String
String lastPath;
if(last!=null && (lastPath=last.getPath())!=null){
// The assignment above is an acceptable one, as it saves a nested if statement
    // traverse your path
    while(page!=null && page.getPath()!=null && !(page.getPath().equals(lastPath))){
        path.add(page);
        page=page.getParent();
    }
}
Collections.reverse(path);
return path;//return path or empty list
}

有了这个改进,你不应该再获得任何解释了。在前端,您现在可以检查您的列表是否为空,并采取相应的行动

* 旁注1: * 我不确定在什么情况下你想要将“from”添加到路径中(所以我把它留下了out),所以这可能需要添加到提供的代码中。

* 附注2: * 您可能需要考虑EL而不是scriptlet,只是想一想:)

答案 1 :(得分:0)

您需要使用try ... catch块,它可以在顶部节点捕获错误,然后将其传递给用户显示器。阅读try ... catch:)

的文档

答案 2 :(得分:0)

在getParent方法定义中添加if语句,条件是如果Node getParent-ing是顶级节点,则抛出新异常。

如果你是初学者,我相信这个而不是'try-catch'就足够了。

答案 3 :(得分:0)

您需要在循环内检查该条件,如下所示:

public static List<Page> getPath(Page from, Page to) {
  ...
  for (Page page = to.getParent(), .. page = page.getParent()) {
    path.add(page);

    // Check for topmost page with no parent.
    if (page.getParent() == null) {
      break;
    }
  }
  ...
  return path.contains(from) ? path : null;
}