4

以前に似たような質問がされているのを見たことがありますが、受け入れられた回答は、別の質問 (IMO) に対する回答を提供しているように見えます。

会社に入社したばかりで、変更や修正を行う前に、すべてのテストに合格することを確認したいと考えています。私が発見した 1 つを除いてすべて修正しました。これは、(私にとって) Java の予期しない動作によるものです。値が int である Properties オブジェクトにキーと値のペアを挿入すると、オートボクシングが開始され、getProperty が文字列を返すことを期待していました。しかし、それは起こっていることではありません (JDK1.6) - null を取得します。以下のテストクラスを作成しました。

import java.util.*;

public class hacking
{
    public static void main(String[] args)
    {
        Properties p = new Properties();
        p.put("key 1", 1);
        p.put("key 2", "1");

        String s;

        s = p.getProperty("key 1");
        System.err.println("First key: " + s);

        s = p.getProperty("key 2");
        System.err.println("Second key: " + s);
    }
}

そして、これの出力は次のとおりです。

C:\Development\hacking>java hacking
First key: null
Second key: 1

プロパティのソース コードを見ると、次のように表示されます。

public String getProperty(String key) {
    Object oval = super.get(key);
    String sval = (oval instanceof String) ? (String)oval : null;
    return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}

問題のある行は 2 行目です。文字列でない場合は、null を使用します。この動作が望ましい/期待される理由がわかりません。コードはほぼ間違いなく私よりも有能な誰かによって書かれたので、それには正当な理由があると思います。誰でも説明できますか?私がばかげたことをした場合は、時間を節約して、それを教えてください! :-)

どうもありがとう

4

2 に答える 2

2

これはフォーム ドキュメントです: 「Properties は Hashtable から継承するため、put および putAll メソッドを Properties オブジェクトに適用できます。キーまたは値が文字列ではないエントリを呼び出し元が挿入できるようにするため、これらの使用は強くお勧めしません。setProperty メソッドは非文字列のキーまたは値を含む「侵害された」Properties オブジェクトで store または save メソッドが呼び出された場合、呼び出しは失敗します。同様に、propertyNames または list メソッドが呼び出された場合、その呼び出しは失敗します。文字列以外のキーを含む「侵害された」Properties オブジェクト。

于 2013-03-18T11:03:06.183 に答える
0

ドキュメントに従ってsetPropertyメソッドを使用するようにコードを変更しましたが、コンパイルエラーが発生します

package com.stackoverflow.framework;
import java.util.*;

public class hacking
{
    public static void main(String[] args)
    {
        Properties p = new Properties();
        p.setProperty("key 1", 1);
        p.setProperty("key 2", "1");

        String s;

        s = p.getProperty("key 1");
        System.err.println("First key: " + s);

        s = p.getProperty("key 2");
        System.err.println("Second key: " + s);
    }
}
于 2013-03-18T11:09:13.470 に答える