1

我对 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

4 回答 4

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”添加到路径中(因此我将其省略了),因此您可能需要将其添加到提供的代码中。

*旁注2: *您可能想考虑EL而不是scriptlet,只是一个想法:)

于 2013-04-12T23:41:54.797 回答
0

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

于 2013-04-12T22:31:34.223 回答
0

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

如果您是初学者,我相信这而不是“try-catch”就足够了。

于 2013-04-12T22:33:49.280 回答
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;
}
于 2013-04-12T23:23:02.903 回答