java.lang.NullPointerException试图从hashmap获取特定值

时间:2014-12-02 10:10:55

标签: java hashmap

我现在花了几个令人沮丧的日子,并希望得到一些帮助。我在Lotus Domino 8.5.3中有一个Java代理,它由我的Lotusscript验证代理的cgi:POST激活,该代理检查客户是否填写了账单和交付地址表单。这是将传入数据解析为HashMap的代码,其中字段名称映射到它们各自的值。

HashMap hmParam = new HashMap(); //Our Hashmap for request_content data

//Grab transaction parameters from form that called agent (CGI: request_content)
if (contentDecoded != null) {
    String[] arrParam = contentDecoded.split("&");                  
    for(int i=0; i < arrParam.length; i++) {
        int n = arrParam[i].indexOf("=");
        String paramName = arrParam[i].substring(0, n);
        String paramValue = arrParam[i].substring(n + 1, arrParam[i].length());

        hmParam.put(paramName, paramValue); //Old HashMap
        if (paramName.equalsIgnoreCase("transaction_id")) {
          transactionID = paramValue;
          description = "Order " + transactionID + " from Fareham Wine Cellar";
          //System.out.println("OrderID = " + transactionID);
        }

        if (paramName.equalsIgnoreCase("amount")) {
            orderTotal = paramValue;
        }
        if (paramName.equalsIgnoreCase("deliveryCharge")) {
            shipping = paramValue;
        }
    }   
}

上面的代码块可以追溯到我原来将购物车集成到巴克莱EPDQ支付网关的一年多。在该代理中,我恢复了特定的值并构建了一个表单,然后在此类代理中提交给EPDQ CPI;

out.print("<input type=\"hidden\" name=\"shipping\" value=\"");
out.println(hmParam.get("shipping") + "\">");

我想在这里做同样的事情,除非我尝试使用空指针异常崩溃。我可以使用下面的代码片段成功遍历hashMap,所以我知道数据存在,但我无法理解为什么我不能使用myHashMap.Get(key)按照我想要的顺序获取每个字段值html表单。另一个应用程序中的原始代理仍在使用中,所以发生了什么?数据也基本上没有变化,字符串字段名映射到字符串值。

Iterator it = cgiData.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    out.println("<br />" + pairs.getKey() + " = " + pairs.getValue());
    //System.out.println(pairs.getKey() + " = " + pairs.getValue());
}

1 个答案:

答案 0 :(得分:0)

我做了两件可能产生影响的事情,在尝试调试正在发生的事情的过程中,我需要这些进一步的导入;

import java.util.Iterator;
import java.util.Map;

虽然我没有在hashMap上进行迭代,但我还是将它们留了下来,这样我就可以选择在应用程序投入生产时将hashMap转储到我的系统审计跟踪中。在它开始工作之后的下面片段的变体中,我能够获得我需要的任何数据,即使值为Null,并且toString()似乎也是可选的,因为它对输出没有任何影响。

String cgiValue = "";
cgiValue = hmParam.get("ship_to_lastname").toString();
out.println("<br />Lastname: " + cgiValue);
out.println("<br />Company name: " + hmParam.get("bill_to_company"));
out.println("<br />First name: " + hmParam.get("ship_to_firstname"));

我做的第二件事,在尝试使代码工作时,我启用了选项&#34;使用调试信息编译Java代码&#34;对于代理,这可能对项目在Domino Developer客户端中的构建方式有所帮助。

我认为我必须将这归结为Domino Designer编译代码时创建的某种内部错误。昨晚我在做这件事时发生了重大事故,这使得我的笔记本电脑需要冷启动。您还可能会发现,在使用Domino Designer 8.5.x时,如果您不使用KillNotes不时完全关闭所有任务,则可能会发生奇怪的事情