问题再现与解读

- 首次,使用 java 命令+任意参数 都会报这个错误,最典型的就是
java -version - 解读一下这个报错信息,注册表路径
SoftwareJavaSoftJava Runtime EnvironmentCurrentVersion当前值是 1.8,但是 java 命令版本是 1.7
问题解决
方式一:删除C:WindowsSystem32下的java.exe, javaw.exe, javaws.exe

方式二:修改环境变量顺序
这是我原本的 Path 环境变量配置:
%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;%JAVA_HOME%in;
修改后把%JAVA_HOME%in提前到%SystemRoot%system32;之前
%JAVA_HOME%in;%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;
问题分析过程
环境变量
Windows 中的 DOS 操作系统中的 Path 环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 Path 中指定的路径去找。
java 命令,其实是由系统根据 Path 环境变量路径寻找 java.exe 程序来运行。
CMD - where 命令
描述:显示符合搜索模式的文件位置。在默认情况下,搜索是在当前目录和 PATH 环境变量指定的路径中执行的。
我们可以运行 where java 来查看

我的 java 1.8 安装在 D:libjdk1.8, 但是 %SystemRoot%system32(即对应C:WindowsSystem32) 优先于 %JAVA_HOME%in(即对应 D:libjdk1.8in)匹配,所以找到了 C:WindowsSystem32java.exe, 但是这是java 1.7的运行程序。
运行 regedit 打开注册表
点击 开始 --> 运行... --> 输入 regedit, 回车 --> 打开注册表
找到 HKEY_LOCAL_MACHINESoftwareJavaSoftJava Runtime Environment, 就可以查看注册表属性了,我的 CurrentVersion 是 1.8

总结
- 使用
regedit查看注册表中的 CurrentVersion - 使用
where java查看路径 - 让注册表中的
CurrentVersion和 where 命令找到的第一个java.exe的版本保持一致!