Java系统属性是否总是非空的?

9

有一些Java系统属性,其中包括java.homepath.separatoruser.home等内容。规范没有提及这些值的存在是否有正式承诺。

特别是我对user.home很感兴趣。它是否总是指向某个存在的路径?


我认为这些是键。 - anshulkatta
@anshulkatta;我猜键总是存在的-但问题是,它们是否总是指向某些东西(明智的)? - miku
@miku 只有在存在值的情况下才会有键,查看我的回答如下。 - DevZer0
user.home 是与操作系统相关的,但它很少出错。 - fge
1
@fge,是的,这也是我的印象。我只是好奇在什么情况下可能不设置默认值。我的用例:应用程序在启动时创建一个~/.mycache文件;我需要事先显式检查user.home的存在吗? - miku
1
好的,你不必这样做,你可以直接使用Files.createDirectories();如果它失败了,你就知道JVM在欺骗你 ;) - fge
4个回答

4

我认为你可以安全地假设在任何最近的(由Oracle提供的)JVM中,列表中的所有属性都是可用的。

然而,在这种情况下,null检查更具防御性,且不会有太大的开销。

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


1
+1 表示用户可以将任何属性设置为不合理的内容。 - kdgregory

3
您指出的文档说明了: getProperty方法返回一个字符串,其中包含属性的值。如果该属性不存在,则此版本的getProperty返回null
因此,如果属性不存在,则会得到null值。

2
我不确定他的意思是什么。当然,Java系统属性“mambo.jumbo”将是null没有问题,但常规属性是否可能未初始化? - Peter Jaloveczki
@PeterJaloveczki:是的,我更感兴趣的是当“默认”属性没有定义时的情况(不考虑用户将其显式设置为垃圾的情况,例如application.jar -Duser.home=good/luck)。 - miku

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的具体参考,它似乎大多数时候都被定义了。查看这个有趣的帖子,在那里人们发布了不同机器上系统属性的列表。


问题的链接给了我一个答案:System.getProperties这组系统属性 始终包括以下键的值:... user.home ... - miku

1
规范说明user.home包含用户主目录,但未指明其可能包含null。我毫不怀疑JVM保证它始终被设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接