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

Java系统属性总是非空的吗?,java,java-home,system-properties,home-directory,Java,Java Home,System Properties,Home Directory,有两种,其中包括java.home和path.separator,user.home。报告没有提到关于这些价值观存在的任何正式承诺 我尤其对user.home感兴趣。它是否总是指向某个现有路径?您指出的文档说明 getProperty方法返回一个包含属性值的字符串。如果属性不存在,此版本的getProperty将返回null。 因此,如果该属性不存在,您会得到一个null值,我认为您可以放心地假设该列表中的所有属性在任何最近(Oracle提供的)JVM中始终可用 但是,null检查更具防御性,在

有两种,其中包括
java.home
path.separator
user.home
。报告没有提到关于这些价值观存在的任何正式承诺


我尤其对
user.home
感兴趣。它是否总是指向某个现有路径?

您指出的文档说明

getProperty方法返回一个包含属性值的字符串。如果属性不存在,此版本的getProperty将返回null。


因此,如果该属性不存在,您会得到一个
null
值,我认为您可以放心地假设该列表中的所有属性在任何最近(Oracle提供的)JVM中始终可用

但是,
null
检查更具防御性,在这种情况下并不昂贵


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

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

默认属性因操作系统而异。有些键没有定义值。在我的机器上,我发现
user.variant
user.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);

      }
    }
Properties prop=System.getProperties();
Set Set=prop.keySet();
迭代器itr=set.Iterator();
while(itr.hasNext()){
Object obj=itr.next();
字符串propVal=System.getProperty(obj.toString());
System.out.println(对象toString()+“=”+propVal);
}
}

关于您关于
user.home
的特定参考,似乎大多数时候都是由它定义的。查看这里,人们发布了不同机器上的系统属性列表

我想这些是keys@anshulkatta; 我猜这些键总是存在的,但问题是,它们是否总是指向某个东西(神智正常?)@miku键只有在有值时才存在,请检查我的答案below@fge是的,这也是我的印象。我只是好奇在什么情况下可能不会设置默认值。我的用例:应用程序在启动时创建一个
~/.mycache
文件;我是否需要事先明确检查是否存在
user.home
?好吧,您不必这样做,只需
Files.createDirectories()
;如果失败了,您就知道JVM在欺骗您;)我不确定他是什么意思。Java系统属性“mambo.jumbo”肯定是空的,没有问题,但是常规属性是否可以不初始化?@PeterJaloveczki:是的,我更感兴趣的是没有定义“default”属性的情况(不考虑这种情况,当用户将它们显式设置为垃圾时,如
application.jar-Duser.home=good/luck
。该问题的链接给了我一个答案::这组系统属性始终包括以下键的值:…
user.home
…+1,用于指出用户可以将任何属性设置为非垃圾。)感性的。