System.getProperty返回null的主因是属性名不存在或拼写错误;标准属性如"java.version"大小写敏感,且需确认JVM是否完整初始化,容器或精简环境可能导致部分属性缺失。
System.getProperty 返回 null 的常见原因
调用
或类似键却得到
,大概率不是代码写错了,而是传入了不存在的属性名。Java 标准属性名是固定拼写的,大小写敏感,比如
有效,但
或
都会返回
。
更隐蔽的情况是:某些 JVM 启动参数(如
)手动覆盖了系统属性,或在容器/嵌入式环境中部分属性未被初始化(如精简版 JRE、GraalVM native image)。这时建议先用
粗略查看当前所有可用键值对。
必须掌握的 5 个核心属性名
获取运行时环境和版本,不需要查文档翻半天,记住这五个最常用、最稳定的键:
:JDK 主版本号,如
(注意不是
)
:含构建信息的完整运行时版本,如
:厂商名,如
或
和
:操作系统名称与内核版本,例如
+
它们在所有标准 JVM 上都保证存在,且不会因用户自定义
参数而被意外覆盖(除非显式覆写)。
立即学习
“
Java免费学习笔记(深入)
”;
区分
java
.version 和 java.specification.version
是实现版本,反映你实际运行的 JDK;而
是 Java SE 规范版本号,比如 JDK 17 实现的是 Java SE 17 规范,所以它返回
(纯数字字符串)。两者数值常一致,但语义不同:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
做兼容性判断(如“是否 ≥ Java 11”)应优先用
,因为它是规范层面的承诺
排查环境问题(如确认是否用了 Temurin 而非 Zulu)则看
+
可安全转为数值比较,但
含
和字母,不能直接 parse
在容器或 CI 中读取失败怎么办
Docker 容器里
可能返回
而非
,这不是 bug,是 JVM 对底层架构的标准化映射;更关键的是,某些 CI 环境(如 GitHub Actions 的 ubuntu-latest)默认用 JRE 而非 JDK,导致
指向 JRE 目录,
等内部属性可能缺失——但这不影响前述五个核心属性。
如果仍需验证 JDK 完整性,可组合使用:
别依赖
开头的属性,它们是非标准、随时可能移除的内部实现细节。
真正容易被忽略的点是:属性值本身不带校验逻辑,
不抛异常也不警告,出错就静默返回
。所以每次取值后务必判空,尤其在自动化脚本或启动检查逻辑中。
System.getProperty("java.version")null"java.version""Java.Version""java_version"null-Djava.version=xxxSystem.getProperties().list(System.out)"java.version""17.0.1""17""java.runtime.version""17.0.1+12-LTS""java.vendor""Eclipse Adoptium""Amazon""os.name""os.version""Linux""5.15.0-107-generic"-Djava.versionjava.specification.version"17"java.specification.versionjava.versionjava.vendorDouble.parseDouble(System.getProperty("java.specification.version"))java.version"+"System.getProperty("os.arch")"amd64""x86_64""java.home""sun.boot.class.path"String home = System.getProperty("java.home");
String version = System.getProperty("java.version");
if (home != null && version != null) {
// 基本可认定是可用的 JDK/JRE 环境
}"sun.*"System.getPropertynull