很久以前,我从我的前同事那里得到了为他工作的代码,但我不能使它工作。
使用调试器,我得出结论,我的类在这个方法有断点:
((Map<String, List<byte[]>>)metaData).put(HEADERELEMENTS, headerOMElements);
put
方法有声明- String key, List <byte[]> value
。我也尝试过
((Map<String, List<byte]>>)metaData).put("HEADERELEMENTS",headerOMElements);
但情况是一样的。我的printStackTrace
返回NullPointerException
。我做了headerElements
的日志记录
number of headerOMElements (headerOMElements.size();)=1
headers are(before calling the method PUT) (headerOMElements.toString();): [[B@d000d]
如何得出问题是什么并解决它?我不是高级Java专家,所以我真的需要帮助。
基于您提供的有限信息,并假设它是准确的,唯一可能的方法1在这一点上可以抛出NullPointerException
是如果metaData
是null
。
所以…
修改你的代码,在你认为抛出NPE的语句之前打印出metaData
的值;例如
System.err.println("metaData is " + metaData);
如果输出显示metaData
是null
,那么下一步是检查您的代码,找出为什么是null
。有可能你没有初始化它,或者你从其他地方传入它,那里也是null
。
如果输出显示metaData
不是null
,那么你在问题中陈述的事实/假设之一必须是不正确的。对于进一步的诊断,我们需要:
- 的真正的代码,复制和粘贴(不是键入像你似乎已经做了…),以及
- 完成堆栈跟踪。
1 -对于某些类型的Map
,如果密钥为null
,您也可以获得NPE。但是,该异常将在put()
方法调用中抛出。此外,你说当你使用字符串作为键时,你也会遇到同样的问题。所以这不是解释。另一种可能的解释是,有多个线程在没有同步的情况下更新映射。这可能会给出一个NPE(随机),但NPE将在put
或Map
实例的其他方法中。
如果你想放入映射中的数据不是空的,在你放入之前,你的映射可能是空的,你会得到一个NullPointerException
或