0

ListResourceBundle 実装では、null 値を含むいくつかのキーを持つ配列を定義します。null 値を含むバンドルのロード プロセスを正常にコンパイルします。ただし、null 以外の値を持つキーで getObject を呼び出すと (次の例のように、値が "high" の "Pollution" のように)、NullPointerException が返されます。

なぜそれがそのように起こるのか、あなたには考えがありますか?

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

値、同じ配列の他のキーはそうではありません。

更新:これは私が受け取るスタックトレースです:

スレッド「メイン」での例外ResourceBundleThing.main(ResourceBundleThing.java:38) の ResourceBundle.java:387)

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" に対応する null がありますが、null 以外の値を持つ "Pollution" のみを参照しています。それでも NullPointerException が発生します。そのnullを「住民」から削除すると機能します..そこに問題があることはわかっています。ただし、その特定のキーと値のペアを使用していないため、理由を知りたいです。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ませんが、null 値は許可されません。

于 2013-08-31T14:42:38.830 に答える