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

试图从hashmap获取特定值的java.lang.NullPointerException,java,hashmap,Java,Hashmap,我已经为此花了好几天的时间,希望能得到一些帮助。我在LotusDomino8.5.3中有一个Java代理,它由来自我的Lotusscript验证代理的cgi:POST激活,该代理检查客户是否填写了账单和交付地址表单。这是将传入数据解析为HashMap的代码,在该HashMap中,字段名映射到各自的值 HashMap hmParam = new HashMap(); //Our Hashmap for request_content data //Grab transaction paramet

我已经为此花了好几天的时间,希望能得到一些帮助。我在LotusDomino8.5.3中有一个Java代理,它由来自我的Lotusscript验证代理的cgi:POST激活,该代理检查客户是否填写了账单和交付地址表单。这是将传入数据解析为HashMap的代码,在该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;
        }
    }   
}
HashMap hmParam=newhashmap()//请求内容数据的Hashmap
//从调用代理的表单中获取事务参数(CGI:request\u content)
if(contentDecoded!=null){
字符串[]arrParam=contentDecoded.split(“&”);
for(int i=0;i
上面的代码段可以追溯到我最初将购物车集成到Barclays EPDQ支付网关的一年多时间。在该代理中,我恢复特定值并构建一个表单,该表单随后在代理中提交给EPDQ CPI,如下所示:

out.print("<input type=\"hidden\" name=\"shipping\" value=\"");
out.println(hmParam.get("shipping") + "\">");
out.print(“”);
我想在这里做完全相同的事情,除了当我尝试代理崩溃时出现空指针异常。我可以使用下面的代码片段成功地遍历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());
}
Iterator it=cgiData.entrySet().Iterator();
while(it.hasNext()){
Map.Entry pairs=(Map.Entry)it.next();
out.println(“
”+pairs.getKey()+“=”+pairs.getValue()); //System.out.println(pairs.getKey()+“=”+pairs.getValue()); }
我做了两件可能会产生影响的事情,在尝试调试正在发生的事情的过程中,我需要这些进一步的导入

import java.util.Iterator;
import java.util.Map;
虽然我没有迭代hashMap,但我将它们保留在了case中,这样我就可以选择在应用程序生产时将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"));
String cgiValue=“”;
cgiValue=hmParam.get(“ship_to_lastname”).toString();
out.println(“
姓氏:“+cgiValue”); out.println(“
公司名称:”+hmParam.get(“bill_to_Company”); out.println(“
名字:”+hmParam.get(“ship_to_firstname”);
我做的第二件事是,在试图让代码正常工作时,我为代理启用了“使用调试信息编译Java代码”选项,这可能对Domino Developer客户端中构建项目的方式有所影响


我想我必须把这归因于DominoDesigner编译代码时产生的某种内部错误。昨晚我在做这件事的时候发生了一次严重的车祸,这使得我的笔记本电脑不得不冷启动。您还可能会发现,在使用Domino Designer 8.5.x时,如果不使用KillNotes随时完全关闭所有任务,可能会发生奇怪的事情

您为什么仍然使用原始集合/不使用foreach循环?不要告诉我你仍然使用Java1.4?你能显示stacktrace吗?另外,在底部代码片段中,您迭代了cgiData,但这是同一个HashMap吗?最后,您确定映射中没有空键或值吗?是的,堆栈跟踪在这里很重要,迭代器代码段(cgiData vs hmParam)上还有一点上下文。对于hmParam vs cgiData的轻微混淆,我表示歉意,我创建了cgiData作为相同数据的副本,以检查迭代器的hashMap中的内容,正如我所说的那样,这工作正常,但我无法通过键获取单个值。它现在工作起来,非常奇怪,所以我回到了原来的hmParam hashMap,并且能够成功地获取单个值。