Geocortext IMF框架Null引用异常

时间:2009-09-01 19:33:33

标签: java jsp

仍然存在此问题的问题。如果可以,请帮忙。

所以我试图使用Geocortex IMF框架修复一段代码。我在第40行得到一个错误,它基本上是一个空的异常。它是java和html的混合体。由于某种原因,我似乎无法找出错误为什么拉出空。即使我用数据加载变量,它仍然停在rs = activeLayer.getRecordset();

这是他们填写并提交的地址表

<%@ page errorPage="imfError.jsp" %>
<% 

  /*
     Program: afoAddressForm.jsp

     Purpose: Displays a page to the user to input address values for a
              USAddress type of geocoding query.
     Usage:   </>
     History: 
   */

  String layerId = request.getParameter("layerid");
  String scale = request.getParameter("scale");
  if (layerId == null) {
    throw new Exception("Missing layerid parameter.");
  }
  if (scale == null) {
    throw new Exception("Missing scale parameter.");
  }

%>
<jsp:include page="/imfCopyright.jsp"/>
<html>
<head>
<title></title>
<meta http-equiv="Content-Style-Type" content="text/css">
<link href="../../../imfStyle.css" rel="stylesheet" type="text/css">
<script language="JavaScript" type="text/javascript">
  function doNothing() {
  }
  function submitForm() {
    var strStreetName = document.frm.streetName.value;
    if (strStreetName == "") {
      alert("Please enter street name."  );
        document.frm.streetNumber.focus();
    } else {
      document.frm.action = "afoAddress.jsp?streetName="+strStreetName;
      document.frm.submit();
    }
  }
</script>
</head>
<body bgcolor="#FFFFFF" alink="#ff0000" link="#ff0000" vlink="#ff0000">
<form name="frm" action="JavaScript:doNothing()" method="post">
<input type="hidden" name="layerid" value="<%= layerId %>">
<input type="hidden" name="scale" value="<%= scale %>">
<table width="95%" border="0" cellspacing="0" cellpadding="0">
<center>
<tr><td align="left" class="bb11">Zoom To Street<hr></td></tr>
<tr><td height="10"></td></tr>
<tr>
<td align="left" valign="top" class="bn8">
Enter the street name where you wish to centre the map. 
If matching streets are found, you will be shown a list
of matching street names for you to choose where to 
zoom the map to.

</td>
</tr>
<tr><td height="10"></td></tr>
<tr><td align="center" class="bb8">Street Name</td></tr>
<tr><td align="center" class="bb8"><input name="streetName" size="15" maxLength=40 value=""></td></tr>
<tr><td height="10"></td></tr>
<tr><td align="center" ><input name="btn" type="button" value="Submit" onclick="JavaScript:submitForm()"></td></tr>
<tr><td height="10"></td></tr>
</center>
</table>
</form>
</body>
</html>

以下是地址表单提交的内容

<%@ page import="com.moximedia.aims.*" %>
<% 
  /*
     Program: imfGeocodeUSAddress.jsp
              An Internet Mapping Framework (IMF) system script
              Copyright 2002 Province of British Columbia - all rights reserved
     Purpose: Displays a page of positions matching the address
              input by the user for USAddress geocoding styles.
     History: 20020610 Cates: original coding
              20030724 Cates: send user selection to separate script for labelling.
              20040525 Cates: changed frame reference top to parent
              20050103 Cates: added type to stylesheet link.
  */

  String layerId = request.getParameter("layerid");
  String scale = request.getParameter("scale");
  String StreetName = request.getParameter("streetName");

  AimsMap map = (AimsMap) (session.getAttribute("map"));
  AimsFeatureLayer activeLayer = (AimsFeatureLayer) map.getLayers().getLayer(layerId);

  AimsRecordset rs = null;
  AimsFilter streetFilter = new AimsFilter();

  if (activeLayer != null && activeLayer.getFilter()!= null) {
    streetFilter = (AimsFilter) activeLayer.getFilter();
  }

  String query_String="";
  if (StreetName == null) {
     return;
  }else{
      StreetName = StreetName.toUpperCase();
      query_String = "upper(FENAME) = '" + StreetName +"'";
      //query_String = "FENAME like '%" + StreetName +"%'";
      streetFilter.setWhereExpression(query_String);
  }

  // do the query, and whatever we need to do with the data
  rs = activeLayer.getRecordset();
  rs.clear();
  rs.clearFilter();
  rs.setMaximumResults(100);
  rs.setBufferSize(rs.getMaximumResults());
  rs.setFilter(streetFilter);
  rs.query();

  int count = 0;
  rs.moveFirst();

  while(!rs.EOF()) {
      count++;
      rs.moveNext();
  }
%>
<jsp:include page="/imfCopyright.jsp"/>
<html>
<head>
<title></title>
<meta http-equiv="Content-Style-Type" content="text/css">
<link href="imfStyle.css" rel="stylesheet" type="text/css">
<script language="JavaScript" type="text/javascript">
    function submitForm() {
        document.query.submit();
    }
</script>
</head>
<body onload="submitForm();">
<form name="query" method="post" action="afoSelectDefaultFind.jsp">
<input type="hidden" name="layerid" value="<%= layerId%>" >
<input type="hidden" name="rec" value="1" >
<input type="hidden" name="total" value="<%=count%>" >
<input type="hidden" name="query_String" value="<%=query_String%>" >
</form>
</body>
</html>

错误是当您在表单上按提交时弹出java.lang.NullPointerException错误并将其放在第40行,即rs = activeLayer.getRecordset();.对此的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

好吧,我的猜测是activeLayer为null,然后你在空对象引用上调用getRecordset()。你可以尝试调试吗

map.getLayers().getLayer(layerId);

确保它返回了什么?

答案 1 :(得分:0)

正如克里斯汤普森指出的那样,问题几乎可以肯定,该层是空的。检查您的AXL文件是否具有正确的图层和layerIds。 (对不起,我知道ArcIMS,但我不熟悉Geocortex框架。)

此外,您应该添加代码来检查activeLayer是否为null并抛出一个与NullPointerException不同的异常,因为这会使错误更加明显给下一个程序员带来的错误。有趣的是,如果activeLayer为null,则不应用streetFilter,所以有人在某个时候考虑过这个问题。