日期:2014-05-20  浏览次数:20924 次

java.system.getProperty(String key, String def)方法的疑问
本帖最后由 fulijung 于 2013-12-15 01:53:13 编辑
getProperty(String key, String def) 获取用指定键描述的系统属性(从系统环境或*.properties等配置文件中读取key对应的值,当key值为NULL时,返回def的值; 当key值不为NULL时,返回key的值 )。

但是下面代码输出获得的值为什么不一样呢

public class MyClass
{
    public static void main(String[] args)
    {
         String s1  = System.getProperty("os.name","My default");
         // Notice that the property key is misspelled here:
         String s2  = System.getProperty("os-name","My default");

         // Notice that the output of the following statement can be
         // different for different operating systems:         
         System.out.println("The OS name is: " + s1);

         // The following statement displays the default property name:
         System.out.println("The OS name is: " + s2);
    }
}

/*
下面是打印结果,为何String s2 与 String s1定义语句一样怎么输出就不一样呢?
Output:
The OS name is: Windows XP
The OS name is: My default
*/

看了api文档是如下解释的,但还是想不明白,希望大家用易于理解的话解释一下,到底怎么回事?
getProperty
public static String getProperty(String key,
                                 String def)获取用指定键描述的系统属性。 
首先,如果有安全管理器,则用该 key 作为参数调用 checkPropertyAccess 方法。 

如果没有当前系统属性的集合,将用与 getProperties 方法相同的方式首先创建并初始化系统属性的集合。 


参数:
key - 系统属性的名称。
def - 默认值。 
返回:
系统属性的字符串值,如果没有带有此键的属性,则返回默认值。 
抛出: 
SecurityException - 如果安全管理器存在并且其 checkPropertyAccess 方法不允许访问指定的系统属性。 
NullPointerException - 如果 key 为 null。 
IllegalArgumentException - 如果 key 为空。


------解决方案--------------------
如果key为null,会抛NullPointerException
如果key值不在系统属性集合中,返回def
如果key在系统属性集合中,返回该属性的值

os-name不在属性集合中,当然返回def了

------解决方案--------------------
楼主可以将getProperties() 和 getProperty(key, def)结合看,getProperties()取得属性的集合,如果不在集合中的,通过getProperty(key, def)取时,就得到def的默认值了。
getProperties
public static Properties getProperties()确定当前的系统属性。 
首先,如果有安全管理器,则不带参数直接调用其 checkPropertiesAccess 方法。这可能导致一个安全性异常。 
将 getProperty(String) 方法使用的当前系统属性集合作为 Properties 对象返回。如果没有当前系统属性集合,则先创建并初始化一个系统属性集合。