虽然我以前见过类似的问题,但公认的答案似乎提供了一个不同问题的答案(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:Developmenthacking>java hacking
First key: null
Second key: 1
查看Properties源代码,我看到如下:
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。我看不出有什么理由希望/期望这种行为。代码几乎肯定是由比我更有能力的人编写的,所以我认为这样做有一个很好的理由。有人能解释一下吗?如果我做了什么蠢事,节省时间,直接告诉我!: -)
多谢
这是表单docs:因为Properties继承自Hashtable,所以put和putAll方法可以应用于Properties对象。强烈不鼓励使用它们,因为它们允许调用者插入键或值不是string的条目。应该使用setProperty方法。如果在包含非string键或值的"受损"属性对象上调用存储或保存方法,则调用将失败。类似地,如果在包含非string密钥的"受损"Properties对象上调用propertyNames或list方法,则调用propertyNames或list方法将失败。"
我修改了你的代码,按照文档使用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);
}
}