在ListResourceBundle实现中,我定义了一个包含一些包含空值的键的数组。 它编译包含空值的包的加载过程。但是,当我在具有非空值的键上调用getObject时(如下面的示例“污染”,其值为“高”),它会给我一个NullPointerException。
你知道为什么会这样发生吗?
ResourceBundle labels = ResourceBundle.getBundle("bundlething", new Locale("it"));
labels.getObject("Pollution");// here NullPointerException, However Pollution has a \n
值,同一数组的其他键不会。
更新: 这是我收到的堆栈跟踪:
线程“main”中的异常java.lang.NullPointerException at java.util.ListResourceBundle.loadLookup(ListResourceBundle.java:196) 在 java.util.ListResourceBundle.handleGetObject(ListResourceBundle.java:124) 在java.util.ResourceBundle.getObject(ResourceBundle.java:387)at ResourceBundleThing.main(ResourceBundleThing.java:38)
这是我通过将新Locale("it")
作为目标Locale
传递而加载的包:
import java.util.ListResourceBundle;
public class bundlething_it extends ListResourceBundle {
private Object [][] contents ={{"Inhabitants",null},{"Pollution",new Double(3.4034)},{"Lollerball",new Integer(132)}};
public Object[][] getContents()
{
return contents;
}
}
对应于“Inhabitans”存在null,但是我仅指具有非空值的“污染”。我仍然得到一个NullPointerException;如果我从“居民”中删除那个空它就可以了..所以它就是问题,我知道。但是我想知道为什么因为我没有使用那个特定的键值对。 它是否会在调用getObject后立即加载所有值?
提前致谢。
答案 0 :(得分:1)
堆栈跟踪精确指示错误的来源:
Object[][] contents = getContents();
HashMap<String,Object> temp = new HashMap<>(contents.length);
for (int i = 0; i < contents.length; ++i) {
// key must be non-null String, value must be non-null
String key = (String) contents[i][0];
Object value = contents[i][1];
if (key == null || value == null) {
throw new NullPointerException(); // <-- HERE
}
temp.put(key, value);
}
所以,你得到了答案:虽然我没有在文档中提到它,ListResourceBundle
不允许空值。