System.getenv() - 行为取决于是否启用了调试模式

时间:2018-01-22 14:14:53

标签: java eclipse

我尝试检索操作系统的Windows目录。 为了获得正确的路径,我尝试了以下两个命令:

System.getenv().get("WINDIR")
System.getenv().get("SystemRoot")

两个命令都有效,但奇怪的是,第一个命令(WINDIR)只返回路径,如果我 以调试模式运行程序。仅当我在调试模式下运行程序而不是时,后一个命令(SystemRoot)才会返回路径。

所以这个程序

public static void main(String[] args) {
    System.out.println(System.getenv().get("WINDIR"));
    System.out.println(System.getenv().get("SystemRoot"));
}

评估为

// Debug mode
C:\Windows
null

// No Debug mode
null
C:\Windows

这是一种定义的行为吗?

(我的应用程序是Windows特定的,如果我说调试模式,我的意思是默认的Eclipse“Debug as Java Applicaton”运行配置)

1 个答案:

答案 0 :(得分:1)

System.getEnv()是一个重载方法,一个没有参数的实现和一个具有String参数的实现。

  • static Map getenv()返回当前系统环境的不可修改的字符串映射视图。
  • static String getenv(String name)获取指定环境变量的值。

您正在调用没有参数的实现,然后在返回的地图上调用 get()From the Javadoc for System.getEnv()

  • 对于 getEnv()所有平台上返回的地图通常都区分大小写
  • 对于 getEnv(字符串):在UNIX系统上,名称的字母大小写通常很重要,而在Microsoft Windows系统上通常不是

因此,您的代码必须在正确的情况下提供环境变量的名称,并在所有小写字母中指定 windir ,而不是大写。

那就是说,我无法解释你在调试模式下运行时看到的差异。如果我运行下面的程序 - 这只是你的增强版本 - 我会得到相同的结果(如预期的那样),无论它是否在调试模式下运行:

System.getenv().get() windir=C:\WINDOWS
System.getenv().get() WINDIR=null
System.getenv().get() systemroot=null
System.getenv().get() SystemRoot=C:\WINDOWS
System.getenv()       windir=C:\WINDOWS
System.getenv()       WINDIR=C:\WINDOWS
System.getenv()       systemroot=C:\WINDOWS
System.getenv()       SystemRoot=C:\WINDOWS

你可以运行下面的代码两次,一次是在调试模式下,一次是在正常模式下,并建议结果?另外,建议您的环境:Windows版本,Eclipse版本和Java版本。

[这更多是要求提供更多信息而不是最终答案,但我无法将其全部纳入评论。]

import java.lang.management.ManagementFactory;
import java.util.regex.Pattern;

public class App {

    private final static Pattern debugPattern = Pattern.compile("-Xdebug|jdwp");

    public static boolean isDebugging() {
        // https://stackoverflow.com/questions/7397584/how-to-know-my-code-is-running-in-debug-mode-in-ide
        // Taken from the code provided by SO user AlexR
        for (String arg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
            if (debugPattern.matcher(arg).find()) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {

        System.out.println("Running in debug mode? " + App.isDebugging());
        System.out.println("System.getenv().get() windir=" + System.getenv().get("windir"));
        System.out.println("System.getenv().get() WINDIR=" + System.getenv().get("WINDIR"));
        System.out.println("System.getenv().get() systemroot=" + System.getenv().get("systemroot"));
        System.out.println("System.getenv().get() SystemRoot=" + System.getenv().get("SystemRoot"));
        System.out.println("System.getenv()       windir=" + System.getenv("windir"));
        System.out.println("System.getenv()       WINDIR=" + System.getenv("WINDIR"));
        System.out.println("System.getenv()       systemroot=" + System.getenv("systemroot"));
        System.out.println("System.getenv()       SystemRoot=" + System.getenv("SystemRoot"));
    }

}