gpt4 book ai didi

java - System.getenv() - 行为取决于是否启用 Debug模式

转载 作者:行者123 更新时间:2023-11-30 06:19:54 24 4
gpt4 key购买 nike

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

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

这两个命令都有效,但奇怪的是,第一个命令(WINDIR)仅返回路径,如果我在 Debug模式下运行程序。仅当我在 Debug模式下运行程序时,后一个命令 (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 特定的,如果我谈到 Debug模式,我指的是默认的 Eclipse“作为 Java 应用程序调试”运行配置)

最佳答案

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

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

您正在调用不带参数的实现,然后在返回的Map上调用get()From the Javadoc for System.getEnv() :

  • 对于getEnv():在所有平台上返回的 map 通常区分大小写
  • 对于 getEnv(String):在 UNIX 系统上,名称的字母大小写通常很重要,而在 Microsoft Windows 系统上,通常则不然

因此,您的代码必须以正确的大小写提供环境变量的名称,并以全部小写而不是大写指定 windir

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

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

您能否运行下面的代码两次,一次在 Debug模式下,一次在正常模式下,并告知结果?另外,请告知您的环境: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"));
}

}

关于java - System.getenv() - 行为取决于是否启用 Debug模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48383567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com