0

在 ListResourceBundle 实现中,我定义了一个数组,其中包含一些包含空值的键。它可以很好地编译包含空值的包的加载过程。但是,当我在具有非空值的键上调用 getObject 时(如下例中的“污染”,其值为“高”),它给了我一个 NullPointerException。

你知道为什么会这样吗?

ResourceBundle labels = ResourceBundle.getBundle("bundlething", new Locale("it"));
labels.getObject("Pollution");// here NullPointerException, However Pollution has a \n

值,同一数组的其他键没有。

更新:这是我收到的堆栈跟踪:

在 java.util.ListResourceBundle.handleGetObject(ListResourceBundle.java:124) 在 java.util.ListResourceBundle.loadLookup(ListResourceBundle.java:196) 在 java.util.ResourceBundle.getObject( ResourceBundle.java:387) 在 ResourceBundleThing.main(ResourceBundleThing.java:38)

Locale("it")这是我通过传递 new作为目标加载的包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”的空值,但我仅指具有非空值的“污染”。我仍然得到一个 NullPointerException;如果我从“居民”中删除该空值,它就可以工作..所以问题就在那里,我知道。但是我想知道为什么,因为我没有使用那个特定的键值对。它是否会在调用 getObject 后立即加载所有值?

提前致谢。

4

1 回答 1

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

于 2013-08-31T14:42:38.830 回答