4

虽然我之前看到过类似的问题,但接受的答案似乎为不同的问题 (IMO) 提供了答案。

我刚加入一家公司,在进行任何更改/修复之前,我想确保所有测试都通过。除了一个之外,我已经修复了所有问题,我发现这是由于 Java 中的一些(对我而言)意外行为。如果我将键/值对插入到值为 int 的 Properties 对象中,我希望自动装箱发挥作用并且 getProperty 将返回一个字符串。但是,这不是发生的事情(JDK1.6) - 我得到一个空值。我在下面写了一个测试类:

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;
}

违规行是第二行 - 如果它不是字符串,则使用 null。我看不出为什么会期望/期望这种行为的任何原因。几乎可以肯定,代码是由比我更有能力的人编写的,所以我认为这是有充分理由的。谁能解释一下?如果我做了一些愚蠢的事情,请节省时间并告诉我!:-)

非常感谢

4

2 回答 2

2

这是表单文档:“因为 Properties 继承自 Hashtable,所以 put 和 putAll 方法可以应用于 Properties 对象。强烈建议不要使用它们,因为它们允许调用者插入键或值不是字符串的条目。setProperty 方法应该代替使用。如果对包含非字符串键或值的“受损”属性对象调用 store 或 save 方法,则调用将失败。类似地,如果调用 propertyNames 或 list 方法,则调用将失败在包含非字符串键的“受损”属性对象上。”

于 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 回答