2013-03-18 65 views
4

虽然我已经看过类似的前面提到的问题,但接受的答案似乎为不同的问题(IMO)提供了答案。Java属性 - int变为空

我刚加入公司,在做任何修改/修改之前,我想确保所有测试都通过。我已经修复了所有问题,但是我发现这些问题是由于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; 
} 

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

非常感谢

+8

从根本上说,你应该只使用'Properties'为'String'到'String'映射。它扩展'Hashtable'的事实应该被视为一个不幸的实现细节:( – 2013-03-18 10:57:40

+1

我认为是因为属性被设计为只保存字符串,但因为实现扩展Hashtable允许你添加一个对象(类Properties扩展Hashtable < Object,Object>)。如果你只使用setProperty(String key,String value),你将不会进入这种情况 – user1121883 2013-03-18 11:02:25

+0

谢谢,很高兴我在公共场合中并不笨拙,我个人认为数据存储在散列表好的,如果它会有效地破坏数据,它应该变得非常明显。我可以解决它,没有太多的麻烦。 – Amadeus1756 2013-03-18 11:22:44

回答

2

这是形式的文档: “因为属性从Hashtable中,认沽继承和方法的putAll可以应用于属性的对象它们的使用是严格禁止的,因为它们允许调用者。插入其键或值不是字符串的条目,应该使用setProperty方法如果在包含非String键或值的“已泄漏”Properties对象上调用store或save方法,则调用将失败;同样,如果在包含非String键的“已泄漏”Properties对象上调用propertyNames或list方法,则调用将失败。

+0

谢谢,很好的信息。 – Amadeus1756 2013-03-18 11:23:48

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); 
    } 
} 
+0

谢谢乔,只是做了同样的事情)只是发现相同!:-) – Amadeus1756 2013-03-18 11:20:31

+0

如果您使用的是properties.put(),那么您必须使用properties.get()。你不能使用properties.put和properties.getProperty。那是你犯的错误。 put和get是hashtable的方法,而setProperty和getproperty是Property的属性 – Joe2013 2013-03-18 12:37:08