虽然我之前看到过类似的问题,但已接受的答案似乎为不同的问题(IMO)提供了答案。
我刚加入公司,在进行任何更改/修复之前,我想确保所有测试都通过。我已经修复了除了一个之外的所有内容,我发现这是因为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;
}
违规行是第二行 - 如果它不是String,则使用null。 我看不出为什么这种行为会被期望/期望的任何原因。代码几乎肯定是比我更有能力的人编写的,所以我认为它有充分的理由。谁能解释一下?如果我做了一些愚蠢的事情,节省时间并告诉我! : - )
非常感谢
答案 0 :(得分:2)
这是表单文档: “因为Properties继承自Hashtable,所以put和putAll方法可以应用于Properties对象。强烈建议不要使用它们,因为它们允许调用者插入其键或值不是字符串的条目。应该使用setProperty方法。在包含非String键或值的“受损”Properties对象上调用store或save方法,调用将失败。同样,如果在“protected”上调用propertyNames或list方法,则调用将失败包含非String键的Properties对象。“
答案 1 :(得分: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);
}
}