我尝试检索操作系统的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”运行配置)
答案 0 :(得分:1)
System.getEnv()是一个重载方法,一个没有参数的实现和一个具有String参数的实现。
您正在调用没有参数的实现,然后在返回的地图上调用 get()。 From the Javadoc for System.getEnv():
因此,您的代码必须在正确的情况下提供环境变量的名称,并在所有小写字母中指定 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"));
}
}