【问题标题】:Are Java system properties always non-null?Java 系统属性总是非空的吗?
【发布时间】:2013-06-06 02:28:16
【问题描述】:

有几个Java system properties,其中有java.homepath.separatoruser.homespec 没有提到任何关于这些价值观存在的正式承诺。

特别是我对user.home 感兴趣。它总是指向一些现有的路径吗?

【问题讨论】:

  • 我认为这些是关键
  • @anshulkatta;我猜这些键总是存在的——但问题是,它们总是指向某事(理智吗?)。
  • @miku 键只有在有值的时候才存在,请看下面我的回答
  • @fge,是的,这也是我的印象。我只是好奇在什么情况下可能不会设置默认值。我的用例:应用程序在启动时创建一个~/.mycache 文件;我需要事先明确检查user.home 的存在吗?
  • 好吧,你不必这样做,你可以Files.createDirectories();如果它失败了,你就知道 JVM 对你撒谎;)

标签: java java-home system-properties home-directory


【解决方案1】:

默认属性会因操作系统而异。会有一些没有定义值的键。在我的机器上,我发现 user.variantuser.timezone 没有任何值!以下是列出所有键值对的代码:

Properties prop = System.getProperties();     
      Set<Object> set = prop.keySet();    
      Iterator<Object> itr = set.iterator();

      while(itr.hasNext()){

          Object obj = itr.next();
          String propVal = System.getProperty(obj.toString());  
              System.out.println(obj.toString()+" = "+propVal);

      }
    }

关于您对user.home 的具体参考,似乎它在大多数情况下都已定义。查看这个interesting post,人们在其中发布了不同机器上的系统属性列表。

【讨论】:

  • 问题的链接给了我答案:System.getProperties这组系统属性 总是包含值 如下键:...user.home...
【解决方案2】:

规范说user.home 包含用户主目录,它没有说它可能包含null。我毫不怀疑 JVM 保证它总是被设置。

【讨论】:

    【解决方案3】:

    我认为您可以放心地假设 该列表中的所有属性 在任何最近的(Oracle 提供的)JVM 中始终可用。

    不过,null 检查更具防御性,在这种情况下也不昂贵。

    我从未见过 user.home 默认为 null 或错误指定。但是,请记住,用户可以使用 -Duser.home=... 覆盖,因此您不能依赖它来指向现有路径。

    【讨论】:

    • +1 指出用户可以将任何属性设置为无意义的东西。
    【解决方案4】:

    您指出的文档说明

    The getProperty method returns a string containing the value of the property. If the property does not exist, this version of getProperty returns null.

    因此,如果该属性不存在,您将获得 null

    【讨论】:

    • 我不确定他的意思。当然,Java 系统属性“mambo.jumbo”将为 null 没问题,但是否有可能未初始化常规属性?
    • @PeterJaloveczki:是的,我对未定义“默认”属性时的条件更感兴趣(不考虑这种情况,当用户将它们明确设置为垃圾时,例如application.jar -Duser.home=good/luck
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2011-08-06
    • 1970-01-01
    • 2015-09-16
    • 2011-03-03
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多