在ListResourceBundle实现的值中具有null

时间:2013-08-31 13:23:43

标签: java io resourcebundle

在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后立即加载所有值?

提前致谢。

1 个答案:

答案 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不允许空值。